STM32F4 UCOS ii 串口中断接收数据丢失

2019-07-21 01:40发布

目前是这样的情况,中断接收数据,有时候数据少一个字节,或者两个字节,并且出现 的时间不定,有时候收几W个字节丢一个,有时候几K个字节就丢了, 一但数据丢失,系统就不能正常运行(当然STM32F4这边是没有问题可以正常运行,但通讯的另一块板就无法正常运行,) 问一下有什么办法可以解决这个问题? 贴中断代码: uint32_t TotalCnt = 0;
__IO uint8_t USART2_Rcv_Index = 0;
extern __IO uint8_t SendPrintIndex;
extern uint8_t RecendCnt;
void USART2_IRQHandler (void)
{  
 #ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
  OSIntEnter();  
 #endif
  
 if(USART_GetITStatus(USART2,USART_IT_ORE) == SET)
 {
  USART_ReceiveData(USART2);
  SendPrintIndex++;
 }
 else if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)
 {
  USART2_RX_BUFFER[USART2_Rcv_Index] = USART_ReceiveData(USART2);   //读取串口2接收到的数据
  USART2_Rcv_Index++;
  TotalCnt++;
  if(USART2_RX_BUFFER[USART2_Rcv_Index - 1] == 0x0A)  //data receive over;
  {
    memcpy(cmdbuffer[bufindw],USART2_RX_BUFFER,USART2_Rcv_Index);
    bufindw = (bufindw + 1)%BUFSIZE;
    buflen = (buflen + 1);
    USART2_Rcv_Index = 0;
  }
 }
 
 #ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
  OSIntExit();
 #endif
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-21 04:16
加入协议栈处理吧。
大批量数据传输,丢一两个字节,是无可避免的。
为了稳定,肯定要协议控制。
参考,modbus
Victor_Ray
2楼-- · 2019-07-21 05:29
回复【2楼】正点原子:
---------------------------------
目前是增加了别一个接收端的数据空间,测试还没有发现问题,当然也想用相应的协议,不过另一个系统太大了,一时半会儿改起来也不容易!最主要还是AVR写的!

一周热门 更多>