本文是基于STMF103C8T6 芯片及開發板,在深入理解串口通信的原理后完成實操,發送Hello Windows,
文章目錄
- 一、通信方式
- 1.串行通信
- 2.并行通信
- 3.同步通信和異步通信
- 二、、串口通信協議
- 1.串口通信協議簡介
- 2.物理層
- ①電平標準
- ②RS-232 信號線
- 3.協議層
- ①波特率
- ②資料位
- ③起始位和停止位
- ④奇偶校驗位
- 三、RS232通信協議
- 1.概念
- 2.電氣特性
- 3.介面
- 4.特性
- 四、STM32的USART串口通信(查詢方式)
- 1.題目要求
- 2.代碼撰寫
- 3.編譯及燒錄
- 4.串口助手的使用
一、通信方式
1.串行通信
一條資訊的各位資料被逐位按順序傳送的通訊方式稱為串行通訊,
串行通訊的特點是:資料位傳送,傳按位順序進行,最少只需一根傳輸線即可完成,成本低但送速度慢,
串行通訊的距離可以從幾米到幾千米, 根據資訊的傳送方向,串行通訊可以進一步分為單工、半雙工和全雙工三種,
資訊只能單向傳送為單工;資訊能雙向傳送但不能同時雙向傳送稱為半雙工;資訊能夠同時雙向傳送則稱為全雙工, 串行通訊又分為異步通訊和同步通訊兩種方式,在單片機中,主要使用異步通訊方式,
串行通訊中,兩個設備之間通過一對信號線進行通訊,其中一根為信號線,另外一根為信號地線,信號電流通過信號線到達目標設備,再經過信號地線回傳,構成一個信號回路,
2.并行通信
并行通訊通常可以一次傳送8bit、16bit、32bit甚至更高的位數,相應地就需要8根、16根、32根信號線,同時需要加入更多的信號地線,比如傳統的PATA線路有40根線,其中有16根信號線和7根信號地線,其他為各種控制線,一次可以傳送2Byte的資料,并行通訊中,資料信號中無法攜帶時鐘資訊,為了保證各對信號線上的信號時序一致,并行設備需要嚴格同步時鐘信號,或者采用額外的時鐘信號線,
通過串行通訊與并行通訊的對比,可以看出:串行通訊很簡單,但是相對速度低;并行通訊比較復雜,但是相對速度高,
更重要的是,串行線路僅使用一對信號線,線路成本低并且抗干擾能力強,因此可以用在長距離通訊上;而并行線路使用多對信號線(還不包括額外的控制線路),線路成本高并且抗干擾能力差,因此對通訊距離有非常嚴格的限制,

3.同步通信和異步通信
-
同步通信要求接收端時鐘頻率和發送端時鐘頻率一致,發送端發送連續的位元流;
-
異步通信時不要求接收端時鐘和發送端時鐘同步,發送端發送完一個位元組后,可經過任意長的時間間隔再發送下一個位元組,
-
同步通信效率高,異步通信效率較低,
-
同步通信較復雜,雙方時鐘的允許誤差較小;異步通信簡單,雙方時鐘可允許一定誤差,
-
同步通信可用于點對多點,異步通信只適用于點對點,

二、、串口通信協議
1.串口通信協議簡介
串口通訊(Serial Communication)是一種設備間非常常用的串行通訊方式,因為它簡單便捷,因此大部分電子設備都支持該通訊方式,電子工程師在除錯設備時也經常使用該通訊方式輸出除錯資訊,
在計算機科學里,大部分復雜的問題都可以通過分層來簡化,如芯片被分為內核層和片上外設;STM32 標準庫則是在暫存器與用戶代碼之間的軟體層,對于通訊協議,我們也以分層的方式來理解,最基本的是把它分為物理層和協議層,
- 物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始資料在物理媒體的傳輸,
- 協議層主要規定通訊邏輯,統一收發雙方的資料打包、解包標準,
簡單來說物理層規定我們用嘴巴還是用肢體來交流,協議層則規定我們用中文還是英文來交流,
下面我們分別對串口通訊協議的物理層及協議層進行講解,
2.物理層
串口通訊的物理層有很多標準及變種,本文中主要介紹RS-232 標準 ,RS-232 標準主要規定了信號的用途、通訊介面以及信號的電平標準,
如圖為使用 RS-232 標準的串口設備間常見的通訊結構

“DB9 介面”之間通過串口信號線建立起連接,串口信號線中使用“RS-232標準”傳輸資料信號,
由于 RS-232電平標準的信號不能直接被控制器直接識別,所以這些信號會經過一個“電平轉換芯片”轉換成控制器能識別的“TTL 標準”的電平信號,才能實作通訊,
①電平標準
根據通訊使用的電平標準不同,串口通訊可分為 TTL標準及 RS-232標準,

②RS-232 信號線
RS-232 串口標準常用于計算機、路由與調制調解器(MODEN,俗稱“貓”)之間的通訊 ,在這種通訊系統中,設備被分為資料終端設備 DTE(計算機、路由)和資料通訊設備 DCE(調制調解器),
RS-232 標準的 COM 口:

計算機與調制解調器之間連接時,只要使用“直通型”的串口線連接起來即可:

3.協議層
串口通信原理:
串口通信的概念非常簡單,串口按位(bit)發送和接收位元組,盡管比按位元組(byte)的并行通信慢,但是串口可以在使用一根線發送資料的同時用另一根線接收資料,它很簡單并且能夠實作遠距離通信,
比如IEEE488定義并行通行狀態時,規定設備線總長不得超過20米,并且任意兩個設備間的長度不得超過2米;而對于串口而言,長度可達1200米,典型地,串口用于ASCII碼字符的傳輸,通信使用3根線完成:(1)地線,(2)發送,(3)接收,
由于串口通信是異步的,埠能夠在一根線上發送資料同時在另一根線上接收資料,其他線用于握手,但是不是必須的,
串口通信最重要的引數是波特率、資料位、停止位和奇偶校驗,對于兩個進行通信的埠,這些引數必須匹配,
根據串口通信的原理接下來我們從這幾個引數入手給大家詳細介紹,
①波特率
本次實驗內容是串口異步通訊,異步通訊中由于沒有時鐘信號,所以兩個通訊設備之間需要約定好波特率,即每個碼元的長度,以便對信號進行解碼,常見的波特率為4800、9600、115200 等,
②資料位
這是衡量通信中實際資料位的引數,當計算機發送一個資訊包,實際的資料不會是8位的,標準的值是5、7和8位,
比如,標準的ASCII碼是0~127(7位),擴展的ASCII碼是0~255(8位),如果資料使用簡單的文本(標準 ASCII碼),那么每個資料包使用7位資料,
注:每個包是指一個位元組,包括開始/停止位,資料位和奇偶校驗位,由于實際資料位取決于通信協議的選取,術語“包”指任何通信的情況,
③起始位和停止位
用于表示單個包的最后一位,典型的值為1,1.5和2位,由于資料是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步,因此停止位不僅僅是表示傳輸的結束,并且提供計算機校正時鐘同步的機會,適用于停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢,
④奇偶校驗位
在串口通信中一種簡單的檢錯方式,有四種檢錯方式:偶、奇、高和低,當然沒有校驗位也是可以的,對于偶和奇校驗的情況,串口會設定校驗位(資料位后面的一位),用一個值確保傳輸的資料有偶個或者奇個邏輯高位,
例如,如果資料是011,那么對于偶校驗,校驗位為0,保證邏輯高的位數是偶數個,如果是奇校驗,校驗位為1,這樣就有3個邏輯高位,
高位和低位不真正的檢查資料,簡單置位邏輯高或者邏輯低校驗,這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收資料是否不同步,
三、RS232通信協議
1.概念
個人計算機上的通訊介面之一,由電子工業協會(Electronic Industries Association,EIA) 所制定的異步傳輸標準介面,全稱為(Universal Synchronous Asynchronous Receiver and Transmitter通用同步異步收發器),是UART的進階版,可以實作同步通信,
2.電氣特性
根據上面串口通信的協議的電平標準介紹,這里的電氣特性為:
邏輯1(MARK): -3V~-15V
邏輯0(SPACE): +3~+15V
3.介面
TX:發送資料輸出引腳,
RX:接收資料輸入引腳,
SW_RX:資料接收引腳,只用于單線和智能卡模式,屬于內部引腳,沒有具體外部引腳,
nRTS:請求以發送(Request To Send),n 表示低電平有效,如果使能 RTS 流控制,當USART 接收器準備好接收新資料時就會將 nRTS 變成低電平;當接收暫存器已滿時,nRTS將被設定為高電平,該引腳只適用于硬體流控制,
nCTS:清除以發送(Clear To Send),n表示低電平有效,如果使能 CTS 流控制,發送器在發送下一幀資料之前會檢測 nCTS 引腳,如果為低電平,表示可以發送資料,如果為高電平則在發送完當前資料幀之后停止發送,該引腳只適用于硬體流控制,
SCLK:發送器時鐘輸出引腳,這個引腳僅適用于同步模式,

本次實驗實作全雙工異步通信只需要三根線:RX、TX和GND,
4.特性
1.邏輯輸入與邏輯輸出特性

2.RS232介面端輸入特性

3.RS232介面端輸出特性

四、STM32的USART串口通信(查詢方式)
1.題目要求
完成一個STM32的USART串口通訊程式(查詢方式即可,暫不要求采用中斷方式),要求:
1)設定波特率為115200,1位停止位,無校驗位;
2)STM32系統給上位機(win10)連續發送“hello windows!”,win10采用“串口助手”工具接收,
2.代碼撰寫
在代碼撰寫前首先要建立工程,通過我們之前的學習可知,工程的建立有以下幾種方法:
①使用CubeMX生成基本工程,詳情可看我之前的文章 STM32CubeMX的安裝和使用
②自己在MDK中建立工程,詳情步驟:STM32建立工程點亮流水燈
③使用網上找的工程模板,例如洋桃電子,可在百度自行搜索,
- usart.c檔案:
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整數部分
fraction=(temp-mantissa)*16; //得到小數部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口時鐘
RCC->APB2ENR|=1<<14; //使能串口時鐘
GPIOA->CRH&=0XFFFFF00F;//IO狀態設定
GPIOA->CRH|=0X000008B0;//IO狀態設定
RCC->APB2RSTR|=1<<14; //復位串口1
RCC->APB2RSTR&=~(1<<14);//停止復位
//波特率設定
USART1->BRR=mantissa; // 波特率設定
USART1->CR1|=0X200C; //1位停止,無校驗位.
#if EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<5; //接識訓沖區非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優先級
#endif
}
將其中的uart_init代碼替換成上述代碼即可,根據代碼可以看出我們的程序如同上述分析得到,我們要先初始化引腳,然后設定波特率和奇偶校驗,
接下來我們需要創建一個usart.h檔案來宣告定義的函式,方便在main.c檔案中呼叫,
- usart.h:
#define __USART_H
#include "sys.h"
#include "stdio.h"
#define USART_REC_LEN 200 //定義最大接收位元組數 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN]; //接識訓沖,最大USART_REC_LEN個位元組.末位元組為換行符
extern u16 USART_RX_STA; //接收狀態標記
//如果想串口中斷接收,請不要注釋以下宏定義
void uart_init(u32 pclk2,u32 bound);
#endif
接下來是主程式的撰寫,在main程式中我們首先就是要呼叫我們的初始化函式,初始化函式的撰寫在usart.c中就已經完成,初始化后我們就需要在主回圈while回圈體內加入我們的串口輸出代碼,
- main.c:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u16 t; u16 len; u16 times=0;
Stm32_Clock_Init(9); //系統時鐘設定
delay_init(72); //延時初始化
uart_init(72,115200); //串口初始化為115200
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;//得到此次接收到的資料長度
printf("\r\n Hello Windows! \r\n\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
}else
{
times++;
if(times%200==0)printf("Hello Windows!\r\n");
delay_ms(10);
}
}
}
在代碼中我們可以看到我們的波特率設定的是題目要求的115200,這里根據用戶需求的不同可以進行更改,
3.編譯及燒錄
編譯結果如圖所示:

可以看到編譯結果顯示沒有報錯,證明我們的程式設計的沒有問題,接下來只需進行燒錄觀察即可,

4.串口助手的使用
首先需要在電腦安裝好CH340驅動,相關資料可在網上自行查找
安裝界面如下:

然后我們還需要安裝串口助手
串口助手打開界面如下:

將左下角埠號選為COM3,波特率設定為115200,點擊左下角打開串口:

看到如圖所示預覽界面不斷輸出Hello Windows,證明實驗成功,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/341966.html
標籤:其他
下一篇:程式員如何用物聯網賺錢?
