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

一、概述

在单片机与串口助手通信时存在很多问题,毕竟一个是通过硬件编程控制的,一个是通过软件编程实现的,两者之间并没有很大的兼容性。最基本的,硬件与软件中很多数据类型是不同的,这就给软件与硬件之间的通信造成了很大的困难。

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='\0'; 

}

其中参数n(定义为unsigned char类型)为想要进行转化的数字,str为指向转化后保存结果的字符串数组头部的指针,该函数最多可转化八位二进制数。

四、编写函数过程中遇到的“坑”

1. 变量i一定不要定义为无符型,因为下面有一个循环,跳出循环的条件是i<0,如果i定义为无符型便会陷入死循环。

2. 在字符串后加'\0',这是串口转发结束的标志,十分重要却容易遗漏。

左肩理想,右肩担当。君子不怨永远不会停下脚步!




你可能感兴趣的:(单片机,通信问题,数据格式转化)