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