单片机与串口助手通信时数据格式转化问题

2019-04-15 18:50发布

一、概述
在单片机与串口助手通信时存在很多问题,毕竟一个是通过硬件编程控制的,一个是通过软件编程实现的,两者之间并没有很大的兼容性。最基本的,硬件与软件中很多数据类型是不同的,这就给软件与硬件之间的通信造成了很大的困难。
1.无线通信:
举个我在做项目中遇到的问题,我们的项目有一部分需要实现手机端软件对硬件实现远程控制,而远程控制就必定涉到软件与硬件之间的通信。通信网络用wifi,用ESP8266-12E CP2102,配置为AP工作模式,由于通信数据量小且不允许产生任何差错,所以通信协议采用的TCP。遇到的问题是:单片机收到的是手机端软件发送来的字符的ASCII码。在经历相互“甩锅”(做软件的说是我硬件程序有问题,我说她们软件有问题)后,最终经过摸索发现java中的byte型数据可以被单片机正常接收。(事实证明,不是我的锅)
2. 有线通信:最近接了一个企业项目,硬件部分做的差不多,准备让企业的人来看一下,经过跟指导老师商量,准备用串口通过串口助手(sscom)展示系统检测参数,但是在做这一部分时发现了很多问题。单片机通过串口发送的数据由串口助手接收后,要么显示的是以数据位ASCII码的值,要么就出现乱码。
二、解决方案
对于上述第二种情况,我想到的原因是或许硬件与软件数据类型以及编码方式不同,种种原因导致出现了这种现象。我首先想到的解决方案便是把数据转化为字符串,把数据以字符串的形式进行发送。在C语言中有可用的函数itoa()函数可以直接调用,虽然C51与C有很多相似之处,但是非常遗憾的是在C51中并没有itoa()函数,这需要自己编写。
三、自己编写的itoa()函数

void itoa(unsigned char n,char *str)
{
char i=0;
int a[9];
do//先取出每一位,共i-1位
{
a[i]=n%10;
n=n/10;
i++;
}while(n>0);


while(i-1>=0)
{
*str=a[i-1]+'0';
i--;
str++;
}
str='