野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12831|回复: 1

串口通信相关问题

[复制链接]
发表于 2017-3-13 16:52:38 | 显示全部楼层 |阅读模式
串口通信,发送端发一串数据,接收端进行简单处理后打印出来;定义了基本的协议格式,发端:5a 09 17 5e 44 8d ff 00 00 00 00(数据) 02 45 a5

02 a5为数据帧第2位到第9位的校验和,如果
校验和正确返回 数据帧A
5a 09 17 5e 44 8d ff 00 30 00 30 01 a6 a5
校验失败返回 数据帧B
5a 09 17 5e 44 8d ff 01 00 00 00 01 47 a5

我现在调试出现的问题是,发送端在连续发生帧的过程中,为什么校验和正确的情况下会输出一遍A再
输出一遍B。如果接收到一帧错误的数据,就算之后接收到一帧正确的数据还是只能返回B,也就是说
只有复位才能重新识别发端的数据,想问问朋友们我的问题怎么解决呢?我觉得是自己的标志位没设对,不知道怎么改了。。。
部分代码如下:
数据处理部分
  //如果校验位没问题接收该帧进数据缓存,如果该帧有问题扔掉该帧,向发送端返回数据位为全零的标识
        if(TotalCheckSum==2*CheckSum )
        {                       
        for(i=0;i<DataLength;i++)
        {
        Rxdata[i]=Rxbuffer[i];
       }                                                       
        Sta=1; //标志位1
        StaMessage=1;
        //StaError=0;
        }
        //如果校验位有问题
         if(TotalCheckSum!=2*CheckSum)
        {       
        for(i=0;i<DataLength;i++)
       {
       Rxerrordata[i]=Rxbuffer[i];
        }
      Sta=1;
    StaError=1;
}
主函数
int main(void)
{
    while(1)
   {
     if(Sta)
     {
        if(StaMessage)
       {
        for(count=0;count<DataLength;count++,Txbuffer_Num++)
        {
         Usart_SendByte(USART1,Rxdata[Txbuffer_Num]);
        }

         StaMessage=0;
        }
      if(StaError)
      {

//开始传帧
      for(count=0;count<DataLength;count++,Txbuffer_Num++)
         {
        Usart_SendByte(USART1,Rxerrordata[Txbuffer_Num]);
         }
         StaError=0;

       }
       Sta=0;
     }
   }

}

                                                               



回复

使用道具 举报

发表于 2017-3-13 17:21:16 | 显示全部楼层
搞不懂,帮顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-15 16:34 , Processed in 0.030180 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表