野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7371|回复: 2

AT命令串口接收数据问题

[复制链接]
发表于 2016-9-26 15:49:32 | 显示全部楼层 |阅读模式
如题,开发板使用串口发送AT命令到通讯模块,接收数据的前几个字节丢失(丢失字节数不定)。串口使用中断接收数据,首先判断接收字节中断,将数据保存到全局变量中。接收完成一帧数据后判断总线空闲中断,并置位一个一帧数据接收完成标志位。此时其它函数可以处理此接收到的全局变量数据。在此中断处理过程中,总是接收不完全所有串口数据,具体中断函数如下,串口配置都一样的,没啥好说的:

  1. void USART2_IRQHandler(void)
  2. {
  3.         uint8_t clear,i;
  4.         static uint8_t byte_cnt = 0;
  5.         //如果是监测到总线空闲的中断,说明数据传输完毕。将计数(数组下标)清零、
  6.         //串口接收到时间修改的标志置位,最后记得要清空中断标志,先读SR、再读DR清除
  7.         if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
  8.         {
  9. recv_cnt = byte_cnt;//接收到的数据字节数量,数组下标+1
  10.                 byte_cnt = 0;//数组下标清零
  11.                 framedata_flag = 1;//一帧数据接收完成标致,其它函数处理完后记得清除标志
  12.                
  13.                 //清除总线空闲中断标志,先读SR、再读DR清除
  14.                 clear = USART2->SR;
  15.                 clear = USART2->DR;
  16.         }       
  17.        
  18.         //如果是接收到一个字节的中断,将其保存到数组中
  19.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  20.         {
  21.                 recv_data[byte_cnt++] = USART_ReceiveData(USART2);//每次接收完一帧数据后数组下标都已清零,因此这里直接使用
  22.                 if(byte_cnt >= 255)
  23.                         byte_cnt = 0;
  24.                 USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除中断标志
  25.         }

  26. }
复制代码
比如发送一个AT\r\n, 正常应该返回OK\r\n, 可能实际K\r\n. 也就是说它丢失的只是前面的数据,而非中间后面的数据。经调试,这个问题极可能是由于空闲中断引起的,但具体原因无从查找。
请问大伙儿对此有何良策?
数据发送接收情况测试如下图:
串口数据.jpg
回复

使用道具 举报

发表于 2016-9-26 16:28:56 | 显示全部楼层
这个串口调试助手有bug的,换一个吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-26 17:19:12 | 显示全部楼层
flyleaf 发表于 2016-9-26 16:28
这个串口调试助手有bug的,换一个吧

跟串口助手没太大关系,接收的数据在Debug下查看数据确实丢失了数据
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 23:16 , Processed in 0.041045 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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