请教单片机串口接收字符串问题?

totoro3425   2009-12-22 21:41 楼主
外围模块输出数据格式如:$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;
                 }
            }
}
帮忙看下这样写对不对?哪个老大帮我改下代码?小弟分比较少,不好意思!

回复评论 (7)

协议不完整

逗号间的数据是3个字节吗?

最好给一个完整的约定

然后,这个是如果那个啥的话,给分就不太厚道
点赞  2009-12-22 21:59
老大,分不多呀!帮个忙色!
点赞  2009-12-22 22:05
呵呵呵,顶下、
点赞  2009-12-22 22:12
在中断里不要做统计,仅仅接收存储。一次完整的数据全都接收完毕后再统一做处理。这样做逻辑清晰,也容易调试错误。
点赞  2009-12-23 00:04
问题出在len=sprintf(stringaz,"%s",stringaz+1);
替换成 len=iaz 。
点赞  2009-12-23 08:37
1楼说的对,协议介绍的不完整。

不过从代码上看,


  1.             if(record==1)
  2.             {
  3.                 if(SBUF==0x2c){douhao++;}
  4.                 if(douhao==1)
  5.                 {
  6.                     stringaz[iaz]=SBUF;//中间段字符数据
  7.                        iaz++;
  8.                 }

这段好像就有问题,实际上,接收时会将逗号一起存到stringaz中,而且if(douhao==1) 是不是也有问题?如果遇到第二个逗号的话,后面的字符便无法接收。是不是后面的  省略处理最后段字符数据  里面有相应的处理代码?代码不全,只能估计了。
点赞  2009-12-23 14:14
len=sprintf(stringaz,"%s",stringaz+1);
........你这句是想做什么呀?
点赞  2009-12-23 17:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复