018_STM32程序移植之_串口接收中文
Posted luxiaoguogege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了018_STM32程序移植之_串口接收中文相关的知识,希望对你有一定的参考价值。
(一)在平时数据传输中很少用到接收中文的情况,但是最近需要用到就花了半天时间来弄弄
(二)接收原理,从现在接收情况分析:一个中文占两个数据的空间,也就是两个十六进制可以转化成为一个中文
(三)示例情况,用Hex Editor来看看中文 “你好”,可以看到四个十六进制数据:0xc4,0xe3,0xba,0xc3
(四)我们的目的还是单片机通过串口来进行数据的接收,用CH340短接T和R看看发送“你好”也是会接收到十六进制0xc4,0xe3,0xba,0xc3
(五)从上面两点来看,一个中文占据两个数据,也就是说当我们发送“你好”给单片机时候实际中断了四次,接收到的数据分别为0xc4,0xe3,0xba,0xc3
那么我们就可以通过接收到的数据来将数据转化成为中文了,搜索GB2312表可以知道对应的“你” = 0xe3c4;; "好" = 0xc3ba
也就是两位对应一个中文嘛,那么如何将0xc4,0xe3合成0xe3c4;;将0xba,0xc3合成0xc3ba,然后将数据转化成为字符形式就可使转化成为中文了
(六)通过C语言的方法来进行上面四个数据转化成为中文,我用的是VS中的C++来编译的,哪里都可以定义数组那些,如果出错请自行修改将定义放到前面来。
1 #include <stdio.h> 2 #include <string.h> 3 using namespace std; 4 char *Chinese(int table[],char length,char str[]); /*将数据放进去得到字符出来*/ 5 int convert_data(int table[2]); 6 void main(void) 7 { 8 /*GB2312,你的代码是0xe3c4,好的代码是0xc3ba,具体的可以使用软件Hex Editor来看看*/ 9 int test1[] = {0xe3c4}; /*你*/ 10 printf("%s ",test1); 11 int test2[] = {0xc3ba}; /*好*/ 12 printf("%s ",test2); 13 14 /*单片机发送或者接收到“你好”,会得到下面四个数据,将下面四个数据转换成中文“你好”*/ 15 int table[4] = {0xc4,0xe3,0xba,0xc3}; 16 char str[100]; 17 /*输入数组 长度 返回保存地址*/ 18 char *str4 = Chinese(table,4,str); 19 printf("%s ",str4); 20 } 21 22 int convert_data(int table[2]) /*接收的两个数据转换成为一个数据*/ 23 { 24 return (table[1] << 8)|table[0]; 25 } 26 27 char *Chinese(int table[],char length,char str[]) /*将数据放进去得到字符出来*/ 28 { 29 int i = 0; 30 int data1[1]; 31 char data2[100]; 32 data1[0] = (table[i + 1] << 8)|table[i]; 33 sprintf(data2,"%s",data1); 34 strcpy(str,data2); /*先取第一个中文先*/ 35 for(i = 2;i < length; i = i + 2) 36 { 37 data1[0] = (table[i + 1] << 8)|table[i]; /*将0xc4,0xe3弄成0xe3c4,将0xba,0xc3换成0xc3ba*/ 38 sprintf(data2,"%s",data1); 39 strcat(str,data2); 40 } 41 42 return str; 43 }
编译运行的结果
以上是关于018_STM32程序移植之_串口接收中文的主要内容,如果未能解决你的问题,请参考以下文章