娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月10日(星期二)

2018年06月10日 | STM32之串口通信之printf重定向

發(fā)布者:平靜心境 來源: eefocus關(guān)鍵字:STM32  串口通信  printf重定向 手機看文章 掃描二維碼
隨時隨地手機看文章

當(dāng)我們在學(xué)習(xí)一款CPU時,最經(jīng)典的實驗?zāi)^于流水燈了,掌握流水燈的話就基本等于學(xué)會操作I/O口了,那么在學(xué)會I/O之后,相對于我們來說會把學(xué)習(xí)串口的操作放在第二位。在程序運行的時候我們可以點亮一個LED來顯示代碼的執(zhí)行狀態(tài),但有時候我們還想把某些中間量后者其他程序狀態(tài)信息打印出來顯示在計算機上,那么這時候串口的作用就可顯而知了。


下面我們來看一下什么是串口

串行接口簡稱串口,也稱串行通信接口或串行通訊接口(通常指COM接口),是采用串行通信方式的擴展接口。串行接口 (Serial Interface) 是指數(shù)據(jù)一位一位地順序傳送,其特點是通信線路簡單,只要一對傳輸線就可以實現(xiàn)雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠距離通信,但傳送速度較慢。

與并口的區(qū)別:串口形容一下就是一條車道,而并口就是有8個車道同一時刻能傳送8位(一個字節(jié))數(shù)據(jù)。但是并不是說并口快,由于8位通道之間的互相干擾(串?dāng)_),傳輸時速度就受到了限制,傳輸容易出錯。串口沒有互相干擾。并口同時發(fā)送的數(shù)據(jù)量大,但要比串口慢。[3] 串口硬盤就是這樣被人們重視的。

串口通信:串口通信(Serial Communication),是指外設(shè)和計算機間,通過數(shù)據(jù)信號線、地線等,按位進行傳輸數(shù)據(jù)的一種通訊方式。 

串口是一種接口標準,它規(guī)定了接口的電氣標準,沒有規(guī)定接口插件電纜以及使用的協(xié)議。

串口通信協(xié)議

在串口通信中,常用的協(xié)議包括RS-232、RS-422和RS-485。 

?RS-232:標準串口,最常用的一種串行通訊接口。有三種類型(A,B和C),它們分別采用不同的電壓來表示on和off。最被廣泛使用的是RS-232C,它將mark(on)比特的電壓定義為-3V到-12V之間,而將space(off)的電壓定義到+3V到+12V之間。傳送距離最大為約15米,最高速率為20kb/s。RS-232是為點對點(即只用一對收、發(fā)設(shè)備)通訊而設(shè)計的,其驅(qū)動器負載為3~7kΩ。所以RS-232適合本地設(shè)備之間的通信。 

?RS-422:最大傳輸距離為1219米,最大傳輸速率為10Mb/s。其平衡雙絞線的長度與傳輸速率成反比,在100kb/s速率以下,才可能達到最大傳輸距離。只有在很短的距離下才能獲得最高速率傳輸。一般100米長的雙絞線上所能獲得的最大傳輸速率僅為1Mb/s。 

?RS-485:從RS-422基礎(chǔ)上發(fā)展而來的,最大傳輸距離約為1219米,最大傳輸速率為10Mb/s。平衡雙絞線的長度與傳輸速率成反比,在100kb/s速率以下,才可能使用規(guī)定最長的電纜長度。只有在很短的距離下才能獲得最高速率傳輸。一般100米長雙絞線最大傳輸速率僅為1Mb/s。


數(shù)據(jù)傳輸通信方式:

(1)單工通信:

單工通信(Simplex Communication)是指消息只能單方向傳輸?shù)墓ぷ鞣绞健?/p>

在單工通信中,通信的信道是單向的,發(fā)送端與接收端也是固定的,即發(fā)送端只能發(fā)送信息,不能接收信息;接收端只能接收信息,不能發(fā)送信息。基于這種情況,數(shù)據(jù)信號從一端傳送到另外一端,信號流是單方向的。

(2)半雙工通信


半雙工通信(Half-duplex Communication)可以實現(xiàn)雙向的通信,但不能在兩個方向上同時進行,必須輪流交替地進行。

在這種工作方式下,發(fā)送端可以轉(zhuǎn)變?yōu)榻邮斩耍幌鄳?yīng)地,接收端也可以轉(zhuǎn)變?yōu)榘l(fā)送端。但是在同一個時刻,信息只能在一個方向上傳輸。因此,也可以將半雙工通信理解為一種切換方向的單工通信。

(3)全雙工通信:

全雙工通信(Full duplex Communication)是指在通信的任意時刻,線路上存在A到B和B到A的雙向信號傳輸。 全雙工通信允許數(shù)據(jù)同時在兩個方向上傳輸,又稱為雙向同時通信,即通信的雙方可以同時發(fā)送和接收數(shù)據(jù)。在全雙工方式下,通信系統(tǒng)的每一端都設(shè)置了發(fā)送器和接收器,因此,能控制數(shù)據(jù)同時在兩個方向上傳送。全雙工方式無需進行方向的切換,因此,沒有切換操作所產(chǎn)生的時間延遲,這對那些不能有時間延誤的交互式應(yīng)用(例如遠程監(jiān)測和控制系統(tǒng))十分有利。這種方式要求通訊雙方均有發(fā)送器和接收器,同時,需要2根數(shù)據(jù)線傳送數(shù)據(jù)信號。(可能還需要控制線和狀態(tài)線,以及地線)。

同步方式:


同步通信:是一種比特同步通信技術(shù),要求發(fā)收雙方具有同頻同相的同步時鐘信號,只需在傳送報文的最前面附加特定的同步字符,使發(fā)收雙方建立同步,此后便在同步時鐘的控制下逐位發(fā)送/接收。如:SPI總線,I2C總線。 

異步通信:指兩個互不同步的設(shè)備通過計時機制或其他技術(shù)進行數(shù)據(jù)傳輸。也就是說,雙方不需要共同的時鐘。發(fā)送方可以隨時傳輸數(shù)據(jù),而接收方必須在信息到達時準備好接收。如:串口(USART)。



好了,下載我們再來看看STM32開發(fā)板上是如何實現(xiàn)串口通信的,本文以實現(xiàn)printf重定向為例來進行分析!

代碼如下:  

/* 

    *函數(shù)名 :fputc 

    *描述   :重定向C庫函數(shù)printf到USART2 

    * 輸入  :無 

  * 輸出  :無 

  * 調(diào)用  :由printf調(diào)用 

  */  

      

    int fputc(int ch,FILE *f)    

{      

    //while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);     

    USART_SendData(USART2,(unsigned char)ch);        

    while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);      

    return (ch);      

}    

這個代碼中調(diào)用了兩個ST庫函數(shù)。USART_SendData()和USART_GetFlagStatus()。

重定向時,我們把fput()的形參ch,作為串口將要發(fā)送的數(shù)據(jù),也就是說,當(dāng)使用printf()時,先調(diào)用這個fputc()函數(shù),然后使用ST庫的串口發(fā)送函數(shù)USART_Send Data(),把數(shù)據(jù)轉(zhuǎn)移到發(fā)送數(shù)據(jù)寄存器TDR,觸發(fā)我們的串口向PC發(fā)送一個相應(yīng)的數(shù)據(jù)。調(diào)用完USART_SendData()后,要使用 while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET)  語句不停地檢查串口發(fā)送是否完成的 標志位TC,一直檢測到標志為完成,才進入下一步操作,避免出錯。在這段while循環(huán)檢測的延時中,串口外設(shè)已經(jīng)由發(fā)送控制器以及根據(jù)我們的配置把數(shù)據(jù)從移位寄存器一位一位的通過串口線TX發(fā)送出去了。

主代碼:

/* 

* 函數(shù)名:main 

* 描述  :主函數(shù) 

* 輸入  :無 

* 輸出  :無 

*/  

#include "printf.h"  

#include  

  

int main()  

{   

    int i;  

    /* USART init 115200 8-N-1 */  

    USART_init();  

      

  printf("\r\n hahahhahahahahaha \r\n");  

  

  printf("\r\n 歡迎使用奮斗stm32開發(fā)板 \r\n");  

}  

printf.c   

/* 

* 函數(shù)名:main 

* 描述  :主函數(shù) 

* 輸入  :無 

* 輸出  :無 

*/  

#include "printf.h"  

#include  

  

int main()  

{   

    int i;  

    /* USART init 115200 8-N-1 */  

    USART_init();  

      

  printf("\r\n hahahhahahahahaha \r\n");  

  

  printf("\r\n 歡迎使用奮斗stm32開發(fā)板 \r\n");  

}     


#include "stm32f10x_gpio.h"  

#include "stm32f10x_rcc.h"  

#include "stm32f10x_usart.h"  

#include "printf.h"  

#include "misc.h"  

#include "stm32f10x.h"  

  

/* 

    *函數(shù)名 :fputc 

    *描述   :重定向C庫函數(shù)printf到USART2 

    * 輸入  :無 

  * 輸出  :無 

  * 調(diào)用  :由printf調(diào)用 

  */  

      

    int fputc(int ch,FILE *f)    

{      

    while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);     

    USART_SendData(USART2,(unsigned char)ch);        

    while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);      

    return (ch);      

}    

  

  

  

  

  

  

/* 

* 函數(shù)名 :USART_init 

* 描述   :USART GPIO 配置,工作模式配置。115200 8—N-1 

* 輸入   :無 

* 輸出   :無 

* 調(diào)用   :外部調(diào)用 

*/  

  

void USART_init(void)  

{  

   GPIO_InitTypeDef GPIO_InitStructure;  

     USART_InitTypeDef USART_InitStructure;  

      

      

   /*config USART2 clock */  

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);     

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);    

       /*USART2 GPIO config*/   

     /* configure USART2 Tx (PA.02) as alternate function push-pull*/     

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;      

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //復(fù)用推挽輸出      

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      

    GPIO_Init(GPIOA,&GPIO_InitStructure);     

    /* configure USART2 Rx (PA.03) as alternate function push-pull*/  

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;      

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;  //復(fù)用開漏輸入      

    GPIO_Init(GPIOA,&GPIO_InitStructure);     

       /*USART2 mode Config*/       

    USART_InitStructure.USART_BaudRate = 115200;    

    USART_InitStructure.USART_WordLength = USART_WordLength_9b;    

    USART_InitStructure.USART_StopBits = USART_StopBits_1;    

    USART_InitStructure.USART_Parity = USART_Parity_No;    

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    

    USART_Init(USART1,&USART_InitStructure);    

    USART_Cmd(USART1,ENABLE);   

    }  

printf.h

#include "stm32f10x_gpio.h"  

#include "stm32f10x_rcc.h"  

#include "stm32f10x_usart.h"  

#include "stm32f10x.h"  

#include  

  

extern void USART_init(void);  

extern int fputc(int ch, FILE *f);  


關(guān)鍵字:STM32  串口通信  printf重定向 引用地址:STM32之串口通信之printf重定向

上一篇:STM32串口打印printf發(fā)送中文亂碼問題
下一篇:STM32使用官方庫串口輸出亂碼

推薦閱讀

富士康集團在深圳舉辦實體經(jīng)濟與數(shù)字經(jīng)濟融合發(fā)展高峰論壇,并慶祝富士康30周歲生日,創(chuàng)新工場董事長兼CEO李開復(fù)在《AI-工業(yè)互聯(lián)網(wǎng)與消費互聯(lián)網(wǎng)的融合發(fā)展》分論壇進行了主題分享。 他首先談到了中美在人工智能領(lǐng)域的差距與不同,李開復(fù)表示不同意很多專家認為美國領(lǐng)先的觀點,其實中國在很多領(lǐng)域是絕對領(lǐng)先的,我們有很好的基礎(chǔ),并且,人工智能全面超越...
x86和ARM是我們最為熟悉的兩大CPU架構(gòu),不過在經(jīng)典指令集方面,開源的RISC-V也逐漸嶄露頭角。近幾年全球?qū)ISC-V架構(gòu)的關(guān)注都在升溫,尤其是中國對它非常看好,“中國RISC-V產(chǎn)業(yè)聯(lián)盟”和“中國開放指令生態(tài)系統(tǒng)(RISC-V)聯(lián)盟”已在去年相繼成立。比如,華米公司自研的黃山一號處理器(面向可穿戴產(chǎn)品)就是基于RISC-V打造的。近日,RISC-V 指令集和開源...
在今年全國兩會召開期間,人大代表和政協(xié)委員紛紛提出有關(guān)機器人領(lǐng)域相關(guān)的建議,機器人產(chǎn)業(yè)發(fā)展成為智能制造中重要的一個方向。物流機器人這一細分垂直領(lǐng)域是機器人產(chǎn)業(yè)中發(fā)展迅速的子產(chǎn)業(yè)之一。我國物流機器人現(xiàn)狀近年來,在電子商務(wù)、新零售等新興商業(yè)模式創(chuàng)新發(fā)展需求的拉動下,在智能制造、智慧物流等發(fā)展理念的引領(lǐng)下,在人工智能、物聯(lián)網(wǎng)、大數(shù)據(jù)、...
引 言傳統(tǒng)的煙霧報警器一般由煙霧傳感器和煙霧探測芯片構(gòu)成,探測芯片接收傳感器信號并進行處理,從而判斷是否有火災(zāi)發(fā)生。這種煙霧探測器結(jié)構(gòu)簡單、成本低,但存在誤報率高和環(huán)境適應(yīng)能力差的缺點。為了解決這一問題,單片機被嵌入到報警器中,以識別傳感器因環(huán)境影響而產(chǎn)生的干擾信號。但是這樣做又帶來了其它方面的問題:(1)采用一般的單片機,比如5...

史海拾趣

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 临江市| 新丰县| 深圳市| 新绛县| 清远市| 宾川县| 乐东| 晋中市| 东乌珠穆沁旗| 卓资县| 丰顺县| 封开县| 东方市| 攀枝花市| 三原县| 西畴县| 元谋县| 资阳市| 平昌县| 长葛市| 陆丰市| 扶沟县| 尤溪县| 南乐县| 桦甸市| 阳曲县| 昌邑市| 乐至县| 固始县| 闵行区| 外汇| 托里县| 清河县| 禄丰县| 宜都市| 赤城县| 淮阳县| 陵川县| 射洪县| 光山县| 曲松县|