打印
[STM32F1]

串口接收丢失字节问题

[复制链接]
7443|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coderdd|  楼主 | 2017-6-22 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 coderdd 于 2017-6-23 07:52 编辑

用的stm32f103的片子,115200的波特率,现在偶尔发现接收串口数据会漏掉一个字节,有点致命,程序怎样避免呢?是否要调整串口中断优先级?还是怎么优化?
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    RX_Buffer_Temp=USART_ReceiveData(USART1);
    if(uart_num<98)
    {
      RX_Buffer[uart_num] = RX_Buffer_Temp;
      uart_num++;
    }
    else
    {
      uart_num=0;
    }   
    if(RX_Buffer_Temp=='\n'&&RX_Buffer[uart_num-2]=='\r')
    {
      uart_num=0;
      flagReceive = 1;
    }
  }
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) // 检查 ORE 标志
  {
      USART_ClearFlag(USART1,USART_FLAG_ORE);
      RX_Buffer_Temp=USART_ReceiveData(USART1);
  }
}

沙发
feelhyq| | 2017-6-22 20:57 | 只看该作者
if(RX_Buffer_Temp=='\n'&&RX_Buffer[uart_num-2]=='\r') 中的 RX_Buffer[uart_num-2]=='\r'判断有遗漏,如果uart_num = 0,那么         uart_num-2该是多少呢?

使用特权

评论回复
板凳
xmshao| | 2017-6-22 21:02 | 只看该作者
  如果是中断优先级方面的问题,调整可能有效。如果不是,还得从代码逻辑方面找找原因。

使用特权

评论回复
地板
feelhyq| | 2017-6-22 21:06 | 只看该作者
feelhyq 发表于 2017-6-22 20:57
if(RX_Buffer_Temp=='\n'&&RX_Buffer=='\r') 中的 RX_Buffer=='\r'判断有遗漏,如果uart_num = 0,那么     ...

换句话说  Rx_Buffer[97] = '/r',Rx_Buffer[0] = '/n'这种情况考虑到了没有

使用特权

评论回复
5
feelhyq| | 2017-6-22 21:09 | 只看该作者
本帖最后由 feelhyq 于 2017-6-22 21:11 编辑

    if(uart_num<98)
    {
      RX_Buffer[uart_num] = RX_Buffer_Temp;
      uart_num++;
    }
    else
    {
      uart_num=0;
    }   else里面,你仅仅只是将uart_num重置为0了,但是没有接收该字符,应该改为
uart_num=0;
RX_Buffer[uart_num] = RX_Buffer_Temp;
uart_num++;

使用特权

评论回复
6
gygp| | 2017-6-22 22:40 | 只看该作者
发送的速度太快?

使用特权

评论回复
评论
coderdd 2017-6-23 07:58 回复TA
我也打算降低波特率试试 
7
chenci2013| | 2017-6-22 22:40 | 只看该作者
其他的中断函数执行了吗?

使用特权

评论回复
8
biechedan| | 2017-6-22 22:40 | 只看该作者
串口中断代码太多了。

使用特权

评论回复
9
wangdezhi| | 2017-6-22 22:41 | 只看该作者
所有的处理函数都在外部进行设计。

使用特权

评论回复
评论
coderdd 2017-6-23 07:59 回复TA
这个内部已经没什么复杂的操作了,我感觉原因肯定不是内部代码多的问题 
10
isseed| | 2017-6-22 22:41 | 只看该作者
这个是发送的问题吗?

使用特权

评论回复
11
suzhanhua| | 2017-6-22 22:41 | 只看该作者
这个使用工具测试一下数据

使用特权

评论回复
12
mituzu| | 2017-6-22 22:42 | 只看该作者
多长时间会漏掉一个数据呢?

使用特权

评论回复
13
hellosdc| | 2017-6-22 22:42 | 只看该作者
这个波特率不是正常都是这么工作的吗

使用特权

评论回复
14
uiint| | 2017-6-22 22:42 | 只看该作者
115200的波特率不是正常大小的吗

使用特权

评论回复
15
gygp| | 2017-6-22 22:43 | 只看该作者
这个只能通过校验实现了。

使用特权

评论回复
16
chenci2013| | 2017-6-22 22:43 | 只看该作者
不是有中断优先级调试的寄存器吗

使用特权

评论回复
17
biechedan| | 2017-6-22 22:43 | 只看该作者
看一下你的配置代码

使用特权

评论回复
18
wangdezhi| | 2017-6-22 22:43 | 只看该作者
还有其他的中断吗?

使用特权

评论回复
19
isseed| | 2017-6-22 22:44 | 只看该作者
中断的函数不能太复杂。

使用特权

评论回复
20
suzhanhua| | 2017-6-22 22:44 | 只看该作者
串口的优先级是最高的才行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

385

帖子

11

粉丝