找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3969|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口通信C語言程序 編碼標(biāo)準(zhǔn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:711539 發(fā)表于 2020-10-19 19:44 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我們知道,單片機(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 。
那么問題來了,當(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ī)接收。

在上位機(jī)使用hex顯示:


然后使用邏輯分析儀捕獲傳輸?shù)臄?shù)據(jù)內(nèi)容:


發(fā)現(xiàn),結(jié)果是一致的,使用了同一套標(biāo)準(zhǔn)協(xié)議。該協(xié)議為GB2312編碼。
查找編碼可知:




所有內(nèi)容一致!
至此,我們便清楚了單片機(jī)發(fā)送的中文漢字是怎么回事了!
希望對(duì)大家有所幫助!


參考51單片機(jī)C語言代碼如下:
  1. #include<reg52.h>
  2. #include"delay.h"
  3. /*------------------------------------------------
  4.                    函數(shù)聲明
  5. ------------------------------------------------*/
  6. void SendStr(unsigned char *s);
  7. /*------------------------------------------------
  8.                     串口初始化
  9. ------------------------------------------------*/
  10. void InitUART  (void)
  11. {
  12.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  13.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  14.     TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
  15.     TR1   = 1;                  // TR1:  timer 1 打開                        
  16.     EA    = 1;                  //打開總中斷
  17.     //ES    = 1;                  //打開串口中斷
  18. }                           
  19. /*------------------------------------------------
  20.                     主函數(shù)
  21. ------------------------------------------------*/
  22. void main (void)
  23. {
  24. InitUART();
  25. while (1)                       
  26.     {
  27.     SendStr("串口發(fā)送中文測(cè)試");
  28.         DelayMs(240);//延時(shí)循環(huán)發(fā)送
  29.     DelayMs(240);
  30.     }
  31. }

  32. /*------------------------------------------------
  33.                     發(fā)送一個(gè)字節(jié)
  34. ------------------------------------------------*/
  35. void SendByte(unsigned char dat)
  36. {
  37. SBUF = dat;
  38. while(!TI);
  39.       TI = 0;
  40. }
  41. /*------------------------------------------------
  42.                     發(fā)送一個(gè)字符串
  43. ------------------------------------------------*/
  44. void SendStr(unsigned char *s)
  45. {
  46. while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
  47.                 //通過檢測(cè)是否字符串末尾
  48.   {
  49.   SendByte(*s);
  50.   s++;
  51.   }
  52. }
復(fù)制代碼
GB2312編碼表.zip (19.55 KB, 下載次數(shù): 16)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂2 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:115923 發(fā)表于 2020-10-20 08:55 | 只看該作者
這有什么好研究的,  漢字是占用兩個(gè)byte.  單片機(jī)在發(fā)送漢字的時(shí)候,  自動(dòng)會(huì)把" "內(nèi)的內(nèi)容做轉(zhuǎn)換,
完全不用擔(dān)心編寫的代碼需要注意的事項(xiàng).

一句話,  編寫代碼是一樣的. 可以通用在ASCII 和漢字上.
回復(fù)

使用道具 舉報(bào)

板凳
ID:187947 發(fā)表于 2020-10-24 12:59 | 只看該作者
刨根問底   
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表