一、通信方式分類
(一)按數據傳輸線路數量劃分:串行通信與并行通信
類別 | 定義 | 特點 |
---|---|---|
并行通信 | 多個比特同時通過并行線進行傳輸 | 優點:傳輸速率較高;缺點:占用大量芯片資源 |
串行通信 | 將數據拆分成一個個比特,按照先后次序在一根總線上進行發送 | 優點:系統占用資源少,結構簡單;地位:主機間通信的常用方式 |
(二)按數據傳輸方向劃分:單工、半雙工、全雙工通信
通信方式 | 定義 | 關鍵特點 |
---|---|---|
單工通信(Simplex) | 數據僅能沿固定單一方向傳輸,一方永久為發送端,另一方永久為接收端 | 1. 單向不可逆;2. 僅需1根傳輸總線 |
半雙工通信(Half-Duplex) | 數據可沿兩個方向傳輸,但不能同時雙向傳輸,需切換傳輸方向 | 1. 雙向可逆,但需分時;2. 可共用1根傳輸總線;3. 存在“發送-接收”的切換 |
全雙工通信(Full-Duplex) | 數據可沿兩個方向同時傳輸,通信雙方可同時發送和接收數據 | 1. 雙向同步進行;2. 通常需2根獨立傳輸線(如TX/RX);3. 無切換延遲,交互效率最高 |
二、串口通信(UART)核心知識
(一)串口通信定義
通常指“異步串口通信(UART)”,是串行通信的一種,通過1根發送線(TX)和1根接收線(RX)實現雙向數據傳輸,靠“波特率同步”,廣泛用于短距離設備交互(如單片機與電腦、傳感器與控制器),屬于異步串行全雙工通信方式。
(二)串口通信時序
串口通信空閑時數據線為高電平,數據以“幀”為單位傳輸,1幀包含4個固定部分,時序順序如下:
? ? ? ? 空閑時為高電平
- 起始位:幀的開始標志,必為低電平(持續1個“位時間”,$ \text{位時間} = \frac{1}{\text{波特率}} $),用于通知接收端“即將傳數據”;
- 數據位:實際傳輸的二進制數據,通常為5~8位(最常用8位,即1個字節),按“低位在前(LSB)、高位在后(MSB)”傳輸;
- 校驗位(可選):用于檢錯,分奇校驗(數據位+校驗位總“1”的個數為奇數)、偶校驗(總“1”的個數為偶數)、無校驗(省略);
- 停止位:幀的結束標志,為高電平,用于接收端確認1幀結束,以保證下一個字節發送前的起始位能夠表現出來。
(三)串口通信速率
- 速率決定因素:串口通信速率由“波特率(Baud Rate)”決定,波特率指“每秒傳輸的信號變化次數”(對串口而言,通常1個信號變化對應1位數據,因此 $ \text{波特率} \approx \text{每秒傳輸的位數} $,即bps),且收發雙方必須設置相同的波特率,否則會因“位時間不匹配”導致數據傳輸錯誤。
- 常見波特率(單位:bps):1200、2400、4800、9600(常用)、115200等。
三、同步通信與異步通信
通信類型 | 定義 | 優點 | 缺點 |
---|---|---|---|
同步通信 | 通信設備之間除了需要數據線之外,還需額外的時鐘線(如SCLK),收發雙方通過時鐘信號“同步節奏”,數據連續傳輸(無間隙),發送方負責控制時鐘線的變化,每發送一個比特,都需要將時鐘線按照規則進行改變,通常以“塊”為單位傳輸(如16位、32位) | 無需起始/停止位,傳輸效率高 | 需額外時鐘線,線路成本高,時鐘干擾會影響同步 |
異步通信 | 無需時鐘線,收發雙方通過“約定相同的波特率”同步節奏,數據以“幀”為單位傳輸(每幀含起始/停止位,幀間可有空隙) | 線路少(僅TX/RX)、成本低,適合短距離 | 因波特率偏差可能導致誤碼(需預留容錯空間),效率略低 |
串口通信歸屬:串口通信(UART)屬于異步通信,無需時鐘線,靠起始/停止位和約定波特率實現數據同步。
四、常見電平標準(TTL、RS232、RS485)
三者是串口通信的“電平標準”(定義“0”和“1”對應的電壓范圍),核心差異是“電壓范圍”“傳輸距離”和“抗干擾能力”:
電平標準 | 電平定義 | 特點 | 應用場景 |
---|---|---|---|
TTL(晶體管-晶體管邏輯電平) | 高電平(1)= 3.3V/5V,低電平(0)= 0V | 電壓范圍小,抗干擾能力弱,傳輸距離短(通常≤10米) | 設備內部短距離通信(如單片機與傳感器、模塊間的板上通信) |
RS232(Recommended Standard 232) | 高電平(1)= -15V~-3V,低電平(0)= +3V~+15V(與TTL反相) | 采用正負電壓,抗干擾能力比TTL強,傳輸距離中等(通常≤15米),支持全雙工(需TX/RX兩根線) | 早期電腦串口(DB9接口)與外設通信(如Modem、單片機下載),需通過“TTL-RS232轉換器”與TTL設備連接 |
RS485(Recommended Standard 485) | 采用“差分信號”(兩根線A/B,通過A-B電壓差判斷電平:A>B時為1,A<B時為0),無固定電壓范圍(通常差分電壓≥200mV即可識別) | 差分傳輸抗干擾能力極強,傳輸距離遠(最大1200米),支持多設備聯網(最多32/128臺設備共享總線),默認半雙工(僅需A/B兩根線,全雙工需額外兩根線) | 工業現場長距離、多設備通信(如傳感器網絡、PLC控制、智能家居總線),需通過“TTL-RS485轉換器”與TTL設備連接 |
五、USB相關
USB(通用串行總線)是一種常用的串行通信接口,具有即插即用、支持熱插拔、傳輸速率較高、可同時為外部設備供電等特點,廣泛應用于電腦與外部設備(如U盤、鼠標、鍵盤、手機等)的連接與數據傳輸,其通信方式為串行通信,支持全雙工傳輸。
六、51單片機串口通信相關代碼
(一)頭文件引用
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include "delay.h"
(二)串口初始化函數
void init_uart(void)
{ unsigned char t; t = SCON; t &= ~(3 << 6); t |= (1 << 6) | (1 << 4); SCON = t; PCON |= (1 << 7); t = TMOD; t &= ~(3 << 4); t |= (2 << 4); t &= ~(3 << 6); TMOD = t; TH1 = 204; TL1 = 204; TCON |= (1 << 6); IE |= (1 << 7) | (1 << 4);
}
(三)單個字符發送函數
void send_char(char ch)
{ SBUF = ch; while((SCON & (1 << 1)) == 0); SCON &= ~(1 << 1);
}
(四)緩沖區發送函數
void send_buffer(const char *p, int len)
{ while(len--) { send_char(*p++); }
}
(五)串口中斷服務函數
void uart_handler(void) interrupt 4
{ if((SCON & (1 << 0)) != 0) { P2 = SBUF; SCON &= ~(1 << 0); }
}
(六)全局變量定義
xdata char recv_buffer[64];
int pos = 0;
(七)主函數
int main(void)
{ int i = 1; int n = 10; char *p = (char *) &p; xdata char buffer[32]; init_uart(); while(1) { n = sizeof(int); sprintf(buffer, "int size = %d\n", n); send_buffer(buffer, strlen(buffer)); n = sizeof(char); sprintf(buffer, "char size = %d\n", n); send_buffer(buffer, strlen(buffer)); n = sizeof(short); sprintf(buffer, "short size = %d\n", n); send_buffer(buffer, strlen(buffer)); n = sizeof(double); sprintf(buffer, "double size = %d\n", n); send_buffer(buffer, strlen(buffer)); n = sizeof(long); sprintf(buffer, "long size = %d\n", n); send_buffer(buffer, strlen(buffer)); n = sizeof(char *); sprintf(buffer, "char * size = %d\n", n); send_buffer(buffer, strlen(buffer)); delay(0x9FFF); } return 0;
}