我们知道,单片机(计算机)只能识别0和1,那么单片机串口发送数据也是如此,发送的无非就是二进制数据0和1,然后由8位二进制数据组成一个字符(字节)发送出去被接收方接收。比如:我们发送字符'0'-'9','a'-'z','A'-'Z'等等,我们知道发送的这类字符遵ASCII码。其中,查表可知字符'a'对应ASCII码中的值,十六进制:0x61,十进制97,二进制0110 0001
。
那么问题来了,当我们使用单片机发送一串中文字符的时候,单片机是怎么发送的?接收方又是怎么接收和识别的?
以前我做项目都是直接在程序里面使用" "字符串直接发送,根本不理会程序是怎么编译的,单片机到底发了啥,反正能正确接收就好了。其实,这对学习成长来说是非常糟糕的,自我检讨下!
回归正题,首先我们可以肯定的是,单片机只能发送0和1,只不过发送和接收对应的一套标准,即编码协议,不同罢了!
于是,我便做了如下探究。编写了一个串口程序,使用上位机接收。
在上位机使用hex显示:
然后使用逻辑分析仪捕获传输的数据内容:
发现,结果是一致的,使用了同一套标准协议。该协议为GB2312编码。
查找编码可知:
所有内容一致!
至此,我们便清楚了单片机发送的中文汉字是怎么回事了!
希望对大家有所帮助!
参考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)
|