目錄
一、通信種類
1、并行通信
2、串行通信
3、單工模式(Simplex Communication)
4、半雙工通信(Half-Duplex Communication)
5、全雙工通信(Full-Duplex Communication)
6、串行的異步通信與同步通信
(1)異步通信
(2)同步通信
二、串行口通信
(一)UART定義(串行通信協議)
(二)串口通信通信時序(底層邏輯)
1、空閑時
2、起始位
3、數據位
4、校驗位
5、停止位
6、簡述串口通信的通信邏輯(面問)
(三)波特率(bps)
三、三種串行通信方式在物理表現形式的不同
(一)TTL(Transistor-Transistor Logic)
(二)RS232標準
(三)RS485標準
四、串行口寄存器
(一)SBUF寄存器(串行口數據緩沖寄存器)
(二)串行口控制寄存器SCON
(三)電源控制寄存器PCON
五、USB下載電路模塊
六、練習(實現51單片機與電腦之間的通信)
uart.c
main.c
xdata 的作用
計算定時器初值的計算公式
七、MODBUS通信協議
一、通信種類
1、并行通信
????????并行通信是指多個比特同時通過并行線進行傳輸,這種方式的傳輸速率較高,但會占用大量的芯片資源;
2、串行通信
????????串行通信是指將數據拆分成一個個比特,按照先后次序在一根總線上進行發送,串行通信有著系統占用資源少,結構簡單等優點,是主機間通信的常用方式。
注:串口通信(Serial Port)是串行通信的一種,屬于串行通信中的異步通信。我們經常聽到的RS232、RS485、RS422都是串行通信。
3、單工模式(Simplex Communication)
????????主機間通信時如果一方固定為發送端另外一方固定為接收端,通過一根總線實現數據通信。這種通信方式就像是你只能聽別人說話,但無法回答他們一樣,只能單向傳遞信息。
4、半雙工通信(Half-Duplex Communication)
? ? ? ? 半雙工通信是一種通信方式,其中數據傳輸可以在兩個方向之間交替進行,但不能同時進行。換句話說,通信雙方可以既發送數據又接收數據,但不能同時進行這兩種操作。比方說,就像你可以和別人交替說話和傾聽對方說話一樣。當你在說話時,對方在聽你說;當對方在說話時,你在傾聽對方。這種方式允許雙方之間在發送和接收數據之間切換,但不能同時進行。半雙工通信常用于對話式交流和一些簡單的通信場景中。
5、全雙工通信(Full-Duplex Communication)
? ? ? ? 全雙工通信是一種通信方式,其中數據傳輸可以同時在兩個方向進行,允許通信雙方同時發送和接收數據,實現雙向通信。就像打電話一樣,你可以同時說話也可以聽對方說話,雙方可以同時進行數據傳輸,實現雙向溝通。
6、串行的異步通信與同步通信
(1)異步通信
????????指通信中兩個字符(8位)之間的時間間隔是不固定的,而在一個字符內各位的時間間隔是固定的;
? ? ? ? 收發雙方的波特率必須是事先約定好的;
(2)同步通信
????????要求發收雙方具有同頻同相的同步;
? ? ? ? 用專用時鐘信號線來控制時鐘的節奏,以為例:
- SDA(數據線)
- SCL(時鐘線):用于同步雙方時鐘的節奏,一般由發送方決定;
? ? ? 異步通信
????????串口通信時,收發雙方的波特率必須是事先約定好的,否則數據傳輸就會出現混亂。很明顯,為保證每個比特占用數據線的時間,發送方和接收方需按照各自的系統計時且雙方之間的誤差不能太大。通常不能超過(6%)。這種雙方各自“計時”的方式稱為異步。就好比在打字一樣,每次敲擊鍵盤發送一個字母,速度快慢由打字者自己控制,沒規定每敲擊一個字母之間要等多久,只要保證接收端能夠正確識別并解析即可。
同步通信
????????同步通信設備之間除了有數據線(SDA)以為還有一條時鐘線(SCL)。其中SCL就是時鐘線(serial clock)。發送方負責控制時鐘線的變化,每發送一個比特,都需要將時鐘線按照規則進行改變。就好比在合唱團里,大家一起唱歌的節奏是由指揮員指揮的,每個人都按照指揮員的節奏唱歌,保證大家唱的是同一首歌且節奏一致。這種通信方式就稱為同步通信。譬如IIC、SPI等。
注:同步串行通信方式與異步串行通信方式的區別:存在時鐘線的為同步串行
通信方式通信,沒有時鐘線的為異步串行通信方式。
二、串行口通信(全雙工串行通信,異步通信)
(一)UART定義(串行通信協議)
????????UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器)是一種廣泛使用的串行通信協議。它用于在計算機或其他設備之間傳輸數據。UART通信協議通過兩根線(通常稱為TXD和RXD)實現數據的異步傳輸。
TXD(Transmit,發送)線:用于從設備發送數據到另一設備。
RXD(Receive,接收)線:用于從另一設備接收數據到本設備。
(二)串口通信通信時序(底層邏輯)
作為常用的串行通信方式,以TTL為例,串口通信在不同主機之間的數據格式為:
1、空閑時
? ? ? ? 空閑時數據線為高電平;
2、起始位
????????發送放發送一個低電平表示起始位;
3、數據位
????????依據低位先行原則(發送的第一個比特是最低位(最右邊))發送;
4、校驗位
????????分為奇校驗,偶校驗和無校驗;校驗位可發可不發
????????????????奇校驗是指確保數據位加上校驗位中"1",1的總數為奇數;
????????????????偶校驗是指確保數據位加上校驗位中"1",1的總數為偶數;
5、停止位
????????為保證下一個字節發送前的起始位能夠表現出來(把兩個數據二者之間分隔開),校驗位之后發送一個停止位1。(停止位也可是1個、1.5個、2個)
6、簡述串口通信的通信邏輯(面問)
? ? ? ? 雙方在空閑時數據線保持高電平;發送數據時發送方先要發送一個起始位,起始位為低電平;發送數據位(8個bit)以低位先行原則發送(從右往左發);發完后有一個可以選擇的校驗位,校驗分三種,分別為奇校驗、偶校驗、無校驗,奇校驗是數據位加校驗位中1的個數總數為奇數,偶校驗數據位加校驗位1的總數為偶數;校驗位結束后還要發送一個停止位,停止位為高電平。? ??
(三)波特率(bps)
串口通信用波特率來描述數據的傳輸速率問題:
????????很明顯上圖的縱坐標為電壓值,橫坐標就是時間了。無論起始位、數據為還是停止位、校驗位,每個比特在數據線上的時間決定了數據傳輸的速率。
????????串行通信用波特率(bit per second)來描述數據傳輸的速率,記作bps。
????????常見的波特率有1200、2400,4800,9600,115200等,表示每秒鐘傳輸的比特數。以9600為例,表明每秒能傳輸9600個比特。每個比特傳輸時所需的時間為1/9600秒=1.041*10-4秒。
三、三種串行通信方式在物理表現形式的不同
????????主機間通信無論采用并行還是串行方式,都無法避免一個物理現象:導線內阻不為零造成的電壓衰減。以之前討論的TTL電平為例,主機之間的距離會造成高電平在接收端出現衰減現象和串擾(指不同信號之間相互干擾導致信號失真)影響。
(一)TTL(Transistor-Transistor Logic)
????????TTL(Transistor-Transistor Logic)通常指的就是芯片引腳產生的電壓,這個電壓值跟選擇的芯片有關,在51單片機系統下是5v;在2440下是3.3v等等。5vTTL通信距離通常被限制在10~20米之間。(使用TTL方式進行數據傳輸距離受到很大限制)
? ? ? ? 邏輯0:0V低電壓
? ? ? ? 邏輯1:取決于芯片本身(供電電壓)
(二)RS232標準
????????5vTTL通信距離通常被限制在10~20米之間,如果需要更遠的距離,怎么解決呢?為解決這個問題IEEE(Institute of Electrical and Electronics Engineers)頒布了RS232標準,其中規定了:
邏輯高電平(邏輯1):在-3V到-15V之間
邏輯低電平(邏輯0):在+3V到+15V之間
收發主機間有三根線,分別是收、發和地,因此RS232是全雙工的。
理論上RS232能夠傳輸20~30米。
(三)RS485標準
????????同理RS485使用兩根信號線(A和B)來傳輸數據,通過比較A和B之間的電壓差來識別信息,電壓范圍分別為+7V到+12V和-7V到-12V。正電壓表示高電平,負電壓表示低電平。這種差分信號傳輸方式提高了抗干擾能力。RS485的傳輸距離可達1200米,適用于大范圍的數據傳輸需求。由于采用的是壓差,RS485在傳輸數據的某一時刻,兩根線都要用到,所以它是半雙工的。
比較A和B之間的電壓差:
????????邏輯1:+7V到+12V
? ? ? ? 邏輯0:-7V到-12V
四、串行口寄存器
(一)SBUF寄存器(串行口數據緩沖寄存器)
(二)串行口控制寄存器SCON
(三)電源控制寄存器PCON
五、USB下載電路模塊
六、練習(實現51單片機與電腦之間的通信)
uart.c
?void init_uart(void)
?{
?//串口接收
? ? SCON &= ~(3 << 6);
?? ?SCON |= (1 << 6) | (1 << 4);?//使參數生效
?? ?PCON &= ~(1 << 6);
?? ?PCON |= (1 << 7);??//設置波特率,51單片機使用定時器1
?? ?TMOD &= ~(0x0F << 4);
?? ?TMOD |= (2 << 4); //1<<5 與其效果是一樣的,改變第四位和第五位,2為0000 0010
?? ?TL1 = 232;//計算出的定時器初值
?? ?TH1 = 232;?//?? ?打開定時器1
?? ?TCON |= (1 << 6);//打開中斷控制位及串口控制位
?? ?IE |= (1 << 7) | (1 << 4);
}
/*
//全局變量字符型數組
char rcv_buffer[32];
*/
//數組不放到內部RAM放到外部擴展RAM(擴展內存不清0,數組內都是隨機數)
xdata char rcv_buffer[32];
unsigned int pos = 0;//中斷服務函數(TI RI都會導致中斷);接收需要使用中斷
?void uart_handler(void) interrupt 4
?{
??? ?if((SCON & (1 << 0)) == 1)?
?? ?{
?? ??? ?if(pos < 32) //防止越界訪問
?? ??? ?{
?? ??? ??? ?rcv_buffer[pos++] = SBUF;//接收的數據依次存入到該數組
?? ??? ??? ?rcv_buffer[pos] = 0; //接收的字符串后加/0標志
?? ??? ?}
?? ??? ?//P2 = SBUF;
?? ??? ?SCON &= ~(1 << 0);//軟件復位RI(接收中斷請求標志位)清0
?? ?}
?}?//發送(輪詢)
?void send_char(char ch)
?{
? ? SBUF = ch;
?? ?while((SCON & (1 << 1)) == 0);
?? ?SCON &= ~(1 << 1);?? ?//軟件復位TI(發送中斷請求標志位)清0
?}void send_buffer(const char *p, unsigned int len)
{
?? ?while(len--)
?? ?{
?? ??? ?send_char(*p++);
?? ?}
}? // 發送字符串函數?
? void send_str(const char *str)?
? {?
? ?? ?unsigned int len = 0;
? ? while (str[len] != '\0') // 計算字符串長度?
? ? {?
? ??? ??? ?len++;?
? ? }?
? ? send_buffer(str, len); // 調用send_buffer函數發送字符串
? }
?
main.c
int main(void)
{
?? ?const char *s = "Hello World!"; //不常用
?? ?//char buffer[] = {0xAA ,0xBB, 0x00, 0x1A};
?? ?xdata char buffer[16]; //???
? ? init_uart();
? ? while(1)
? ? {
?? ??? ? if(pos != 0)//至少收到一個字節
?? ??? ? {
?? ??? ? ?? ?delay(0xAFFF);//保證數據全部收完,有延遲
?? ??? ??? ?if(strcmp(rcv_buffer,"Hello") == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?send_str("Hi");
?? ??? ??? ?}
?? ??? ??? ?else if(strcmp(rcv_buffer,"See You Later") == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?send_str("Bye");
?? ??? ??? ?}
?? ??? ??? ?/*
?? ??? ??? ?send_buffer(rcv_buffer, pos);
?? ??? ??? ?*/
?? ??? ??? ?pos = 0;//保證下一輪從頭開始收?? ?
?? ??? ? }
? ?? ? ?? ?//send_buffer(buffer, sizeof(buffer) / sizeof(*buffer));
? ?? ? ?? ?//send_buffer(s,strlen(s));
? ? ??? ?//send_char('A');
?? ? ?? ?//delay(0xAFFF);
? ? }
}
xdata 的作用
????????不將內容放在芯片內部的RAM中,放在擴展的RAM中 ;
計算定時器初值的計算公式
????????2^8-2^smod?* focs / 32 / bps / 12
其中smod表示PCON的B7,根據實際情況帶入,不是0就是1(SMOD=1波特率翻倍);
focs晶振頻率,我們這是11.0592M;
bps目標波特率我們這是2400
2^8?這里的8來自定時器的工作方式,因為我們使用的是8位自動重裝方式,所以是8
按照我們的要求2400bps,smod=1時,該公式計算結果為:232。
七、MODBUS通信協議
modbus協議:
????????????????unsigned char s[xx] = ......
????????該協議對數組每個元素內容都做了定義