我們知道,單片機(計算機)只能識別0和1,那么單片機串口發送數據也是如此,發送的無非就是二進制數據0和1,然后由8位二進制數據組成一個字符(字節)發送出去被接收方接收。比如:我們發送字符'0'-'9','a'-'z','A'-'Z'等等,我們知道發送的這類字符遵ASCII碼。其中,查表可知字符'a'對應ASCII碼中的值,十六進制:0x61,十進制97,二進制0110 0001
無標題.png (1.02 KB, 下載次數: 43)
下載附件
2020-10-19 19:12 上傳
。
那么問題來了,當我們使用單片機發送一串中文字符的時候,單片機是怎么發送的?接收方又是怎么接收和識別的?
以前我做項目都是直接在程序里面使用" "字符串直接發送,根本不理會程序是怎么編譯的,單片機到底發了啥,反正能正確接收就好了。其實,這對學習成長來說是非常糟糕的,自我檢討下!
回歸正題,首先我們可以肯定的是,單片機只能發送0和1,只不過發送和接收對應的一套標準,即編碼協議,不同罷了!
于是,我便做了如下探究。編寫了一個串口程序,使用上位機接收。
捕獲0.PNG (110.89 KB, 下載次數: 57)
下載附件
2020-10-19 19:27 上傳
在上位機使用hex顯示:
捕獲1.PNG (114.95 KB, 下載次數: 53)
下載附件
2020-10-19 19:29 上傳
然后使用邏輯分析儀捕獲傳輸的數據內容:
捕獲2.PNG (578.31 KB, 下載次數: 48)
下載附件
2020-10-19 19:29 上傳
發現,結果是一致的,使用了同一套標準協議。該協議為GB2312編碼。
查找編碼可知:
捕獲3.PNG (22.89 KB, 下載次數: 53)
下載附件
2020-10-19 19:32 上傳
捕獲4.PNG (21.71 KB, 下載次數: 57)
下載附件
2020-10-19 19:32 上傳
所有內容一致!
至此,我們便清楚了單片機發送的中文漢字是怎么回事了!
希望對大家有所幫助!
參考51單片機C語言代碼如下:
- #include<reg52.h>
- #include"delay.h"
- /*------------------------------------------------
- 函數聲明
- ------------------------------------------------*/
- void SendStr(unsigned char *s);
- /*------------------------------------------------
- 串口初始化
- ------------------------------------------------*/
- void InitUART (void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
- TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
- TR1 = 1; // TR1: timer 1 打開
- EA = 1; //打開總中斷
- //ES = 1; //打開串口中斷
- }
- /*------------------------------------------------
- 主函數
- ------------------------------------------------*/
- void main (void)
- {
- InitUART();
- while (1)
- {
- SendStr("串口發送中文測試");
- DelayMs(240);//延時循環發送
- DelayMs(240);
- }
- }
- /*------------------------------------------------
- 發送一個字節
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- /*------------------------------------------------
- 發送一個字符串
- ------------------------------------------------*/
- void SendStr(unsigned char *s)
- {
- while(*s!='\0')// \0 表示字符串結束標志,
- //通過檢測是否字符串末尾
- {
- SendByte(*s);
- s++;
- }
- }
復制代碼
GB2312編碼表.zip
(19.55 KB, 下載次數: 16)
2020-10-19 19:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|