當(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);
上一篇:STM32串口打印printf發(fā)送中文亂碼問題
下一篇:STM32使用官方庫串口輸出亂碼
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 做大做優(yōu)做強科技產(chǎn)業(yè)鏈,海光信息、中科曙光公布重組預(yù)案
- 比亞迪攜手阿里云,智能座艙實現(xiàn)語音控制在線服務(wù)
- “眾鈉能源發(fā)布元鈉輕擎電池,鋰鈉融合技術(shù)明年上市”
- 從毫米波到UWB:加特蘭雙技術(shù)引擎驅(qū)動汽車感知通信革命
- 福特汽車申請新專利 或?qū)⑴鋫洳降佬腥藱z測預(yù)警系統(tǒng)
- 伊迪斯科文大學(xué)開發(fā)新系統(tǒng) 提升機器對人類面部表情的識別能力
- 全液晶儀表與HUD等逐漸滲透20萬以內(nèi)市場
- 受大腦啟發(fā) 韓國研究團隊開發(fā)出新型視覺傳感器
- 沃爾沃汽車推出全球首款多功能自適應(yīng)安全帶
- 休斯頓大學(xué)研究人員取得新發(fā)現(xiàn) 鎂可提高固態(tài)電池的安全性和壽命
- 2020年還用驍龍845!LG Velvet 4G版曝光
- 臺媒:蘋果 Phone 12系列7月開始生產(chǎn),或4600元起售
- 三星旗艦功能下放:中端機亦有無線充電
- 小米MIX 4穩(wěn)了!楊柘親自操刀!
- 沃達豐警告:如華為出局,英國引領(lǐng)5G的愿望將受打擊
- 新專利顯示未來MagSafe散熱殼可讓iPhone運行速度更快
- 蘋果Beats首發(fā)全新Powerbeats夜光版無線耳機:搭H1芯片
- 小米POCO M3將于11月24日發(fā)布,為Redmi Note 10 4G重塑版
- OPPO X 2021卷軸屏概念機現(xiàn)場圖賞:科幻中的手機
- OPPO未來科技大會2020:卷軸屏來探索未來手機新形態(tài)
- 分享MSP430F4xxx小RAM堆棧溢出
- 直接用51驅(qū)動MMA7455會燒MMA7455嗎?
- lattice diamond中port被識別成unconnected,該如何解決呢?
- 快來看哪!TI工程師又有小貼士了! 47:解決隔離式開關(guān)的傳導(dǎo)性共模輻射問題
- 用VS2005按照默認定制個CE6,虛擬器啟動后無法安裝軟件,一同步就提示無法下載程序,請重置后再安裝等
- 【經(jīng)驗分享】迅為iTOP4412開發(fā)板上移植SDIO接口WIFI方法
- ST AMG SensorTile開發(fā)大賽評選細則
- 求實習(xí)機會的畢業(yè)大學(xué)生
- 單片機群
- 國內(nèi)企業(yè)強調(diào)自身特色——BCD技術(shù)成為突破口