4599|0

6892

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

串口中断方式接收数据处理时间不足 [复制链接]

现在使用STM32芯片,主要处理方式如下:2路AD采集采用DMA方式,1个键盘和1组LED显示都采用实时扫描,定时器2中断方式作为时间基准,1个串口全双工通讯接收采用中断方式。其中串口和键盘为接受指令端,PC发的数据为指令包长度小于15;指令采集实时性要求高的操作。接收到指令后处理采集在进行显示,显示分为控制板硬件显示和PC端显示部分。定时器基准为5us,串口速度115200;串口接收和发送数据为数据包格式。
现在问题:1.串口接收到数据进行判断并进行相关赋值指令处理。调试发现串口经常接受指令无法完成,有丢失数据包的情况。请教怎么解决这个问题。猜想为处理时间不足操作,如果只接收主机进行处理,那么一直接收到的指令怎么样及时回复主机。如果用DMA,主程序处理指令也需要等候指令。串口中断处理函数如下:
if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
{  if(BufUsartINStatue==0)   //等待主机相应上一个指令后接受新指令。
   {  mid_usartdata=(u8)USART_ReceiveData(USARTx);
      if  (BufUsartInNum==0) //输入指令包格式判断,输入位为0时在是否为起始符;
      {   if  (mid_usartdata==0xbb)  //数据包头判断
          {  BufUsartInData[BufUsartInNum]=mid_usartdata;
             BufUsartInNum++;
          }
      }
      else if(BufUsartInNum<5)
      {  BufUsartInData[BufUsartInNum]=mid_usartdata;
         BufUsartInNum++;
      }
      else if(BufUsartInNum>14)   //超出数据包限定长度结束。
      {  BufUsartINStatue=3;
         BufUsartInNum=0;
      }
      else
      {  if(BufUsartInNum==(BufUsartInData[1]+3)) //判断数据包长度完成;
         {  BufUsartInData[BufUsartInNum]=mid_usartdata;
            if (BufUsartInData[BufUsartInNum]==0xee) BufUsartINStatue="1"; //判断最后一个字符是否为结束符
            else                                        BufUsartINStatue="2";  
            BufUsartInNum=0;
         }
         else
         {  BufUsartInData[BufUsartInNum]=mid_usartdata;
            BufUsartInNum++;
         }
      }
   }
}
此帖出自单片机论坛
点赞 关注
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表