找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3388|回复: 2
收起左侧

单片机串口通信C语言程序 编码标准

[复制链接]
ID:711539 发表于 2020-10-19 19:44 | 显示全部楼层 |阅读模式
我们知道,单片机(计算机)只能识别0和1,那么单片机串口发送数据也是如此,发送的无非就是二进制数据0和1,然后由8位二进制数据组成一个字符(字节)发送出去被接收方接收。比如:我们发送字符'0'-'9','a'-'z','A'-'Z'等等,我们知道发送的这类字符遵ASCII码。其中,查表可知字符'a'对应ASCII码中的值,十六进制:0x61,十进制97,二进制0110 0001 无标题.png
那么问题来了,当我们使用单片机发送一串中文字符的时候,单片机是怎么发送的?接收方又是怎么接收和识别的?
以前我做项目都是直接在程序里面使用" "字符串直接发送,根本不理会程序是怎么编译的,单片机到底发了啥,反正能正确接收就好了。其实,这对学习成长来说是非常糟糕的,自我检讨下!
回归正题,首先我们可以肯定的是,单片机只能发送0和1,只不过发送和接收对应的一套标准,即编码协议,不同罢了!
于是,我便做了如下探究。编写了一个串口程序,使用上位机接收。
捕获0.PNG
在上位机使用hex显示:
捕获1.PNG

然后使用逻辑分析仪捕获传输的数据内容:
捕获2.PNG

发现,结果是一致的,使用了同一套标准协议。该协议为GB2312编码。
查找编码可知:
捕获3.PNG

捕获4.PNG

所有内容一致!
至此,我们便清楚了单片机发送的中文汉字是怎么回事了!
希望对大家有所帮助!


参考51单片机C语言代码如下:
  1. #include<reg52.h>
  2. #include"delay.h"
  3. /*------------------------------------------------
  4.                    函数声明
  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.                     主函数
  21. ------------------------------------------------*/
  22. void main (void)
  23. {
  24. InitUART();
  25. while (1)                       
  26.     {
  27.     SendStr("串口发送中文测试");
  28.         DelayMs(240);//延时循环发送
  29.     DelayMs(240);
  30.     }
  31. }

  32. /*------------------------------------------------
  33.                     发送一个字节
  34. ------------------------------------------------*/
  35. void SendByte(unsigned char dat)
  36. {
  37. SBUF = dat;
  38. while(!TI);
  39.       TI = 0;
  40. }
  41. /*------------------------------------------------
  42.                     发送一个字符串
  43. ------------------------------------------------*/
  44. void SendStr(unsigned char *s)
  45. {
  46. while(*s!='\0')// \0 表示字符串结束标志,
  47.                 //通过检测是否字符串末尾
  48.   {
  49.   SendByte(*s);
  50.   s++;
  51.   }
  52. }
复制代码
GB2312编码表.zip (19.55 KB, 下载次数: 16)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:115923 发表于 2020-10-20 08:55 | 显示全部楼层
这有什么好研究的,  汉字是占用两个byte.  单片机在发送汉字的时候,  自动会把" "内的内容做转换,
完全不用担心编写的代码需要注意的事项.

一句话,  编写代码是一样的. 可以通用在ASCII 和汉字上.
回复

使用道具 举报

ID:187947 发表于 2020-10-24 12:59 | 显示全部楼层
刨根问底   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表