外围模块输出数据格式如:$sat,215,23*
用单片机接收一个字符搞的定,接收字符串问题就来了,要么乱码要么只是显示最后一个。如何将引导词后的2个字符数据分离出来并转换为数据格式!代码如下:
void Com_Int(void) interrupt 4
{
RI=0;
if(SBUF==0x24) //判断是不是$
{
record=1; //记录开始
iaz=0; //记录字符个数变量
douhao=0; //逗号个数
}
if(record==1)
{
if(SBUF==0x2c){douhao++;}
if(douhao==1)
{
stringaz[iaz]=SBUF;//中间段字符数据
iaz++;
}
//省略处理最后段字符数据
if(SBUF==0x2a) //是不是*号
{
stringaz[iaz]='0';
len=sprintf(stringaz,"%s",stringaz+1);
if(len!=0)
{
numaz=atoi(stringaz);
}
numaz=0;
douhao=0;
record=0;
iaz=0;
}
}
}
帮忙看下这样写对不对?哪个老大帮我改下代码?小弟分比较少,不好意思!
协议不完整
逗号间的数据是3个字节吗?
最好给一个完整的约定
然后,这个是如果那个啥的话,给分就不太厚道
在中断里不要做统计,仅仅接收存储。一次完整的数据全都接收完毕后再统一做处理。这样做逻辑清晰,也容易调试错误。
问题出在len=sprintf(stringaz,"%s",stringaz+1);
替换成 len=iaz 。
1楼说的对,协议介绍的不完整。
不过从代码上看,
- if(record==1)
- {
- if(SBUF==0x2c){douhao++;}
- if(douhao==1)
- {
- stringaz[iaz]=SBUF;//中间段字符数据
- iaz++;
- }
这段好像就有问题,实际上,接收时会将逗号一起存到stringaz中,而且if(douhao==1) 是不是也有问题?如果遇到第二个逗号的话,后面的字符便无法接收。是不是后面的 省略处理最后段字符数据 里面有相应的处理代码?代码不全,只能估计了。
len=sprintf(stringaz,"%s",stringaz+1);
........你这句是想做什么呀?