[STM32F1] 串口接收丢失字节问题

[复制链接]
9091|58
mituzu 发表于 2017-6-22 22:44 | 显示全部楼层
数据处理真的会让人崩溃
hellosdc 发表于 2017-6-22 22:44 | 显示全部楼层
一个字节大约是多长时间会漏掉的?
uiint 发表于 2017-6-22 22:45 | 显示全部楼层
以前用过fifo可以解决这个问题的。
biechedan 发表于 2017-6-22 22:45 | 显示全部楼层
看一下你的配置代码
戈卫东 发表于 2017-6-22 22:50 | 显示全部楼层
二姨妈你太让人感动了啊。。。。。。
 楼主| coderdd 发表于 2017-6-23 07:53 | 显示全部楼层
feelhyq 发表于 2017-6-22 20:57
if(RX_Buffer_Temp=='\n'&&RX_Buffer=='\r') 中的 RX_Buffer=='\r'判断有遗漏,如果uart_num = 0,那么     ...

这个不是判断遗漏,是判断终止字符,丢字节和这个无关,因为丢的部分是前面的,仿真可以看得到。
mmuuss586 发表于 2017-6-23 07:56 | 显示全部楼层
加校验,提高通讯可靠性;

出错了重发;
 楼主| coderdd 发表于 2017-6-23 07:58 | 显示全部楼层

这种情况已经排除了,可以无视
 楼主| coderdd 发表于 2017-6-23 08:00 | 显示全部楼层
wangdezhi 发表于 2017-6-22 22:41
所有的处理函数都在外部进行设计。

这个内部已经没什么复杂的操作了,我感觉原因肯定不是内部代码多的问题
 楼主| coderdd 发表于 2017-6-23 08:02 | 显示全部楼层
gygp 发表于 2017-6-22 22:43
这个只能通过校验实现了。

校验肯定可以解决,程序互相重发都可以,但是st的片子我想不会有这种低级的bug,所以先找找原因

评论

st不会有.这个猜的对.  发表于 2017-6-23 16:18
 楼主| coderdd 发表于 2017-6-23 08:03 | 显示全部楼层
biechedan 发表于 2017-6-22 22:43
看一下你的配置代码

void Uart_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
  //PA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //USART1 Rx(PA.10)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1, ENABLE);
  
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
 楼主| coderdd 发表于 2017-6-23 08:04 | 显示全部楼层
suzhanhua 发表于 2017-6-22 22:44
串口的优先级是最高的才行

确定是这样么?
sfd123 发表于 2017-6-23 08:15 | 显示全部楼层
RX_Buffer[uart_num-2]

这个确定不会有问题???
kingkits 发表于 2017-6-23 09:08 | 显示全部楼层
建议使用环形缓冲区,中断只负责处理接收数据到缓冲区,解析数据由普通进程完成
 楼主| coderdd 发表于 2017-6-23 09:12 | 显示全部楼层
sfd123 发表于 2017-6-23 08:15
RX_Buffer

这个确定不会有问题???

百分百确定,如果你仔细看代码的话,这个可以忽略,因为这个只是判断\r\n结束字节标志,丢掉的字节其实是前面的重要信息字节。
zhuomuniao110 发表于 2017-6-23 10:39 | 显示全部楼层
前排大神讲解的很到位。
沧海の海神 发表于 2017-6-23 11:44 | 显示全部楼层
1.把串口中断优先级设置成最高试试,有可能是其他的中断长时间占用CPU导致的。
2.判断/r/n时候应该设置限制条件 uart_num >= 2 否则 RX_Buffer[uart_num-2]可能产生不可预知的结果
3.确认从接收完成一帧 flagReceive = 1;到你应用处理完一帧数据所化的时间, 在这段时间里有没有产生串口接收中断。
yzjgod 发表于 2017-6-23 13:30 | 显示全部楼层
也有可能是环形缓存发生数据覆盖
l0p0c 发表于 2017-6-23 15:35 | 显示全部楼层
确认一下硬件是不是一直在复位???
涛家柒柒 发表于 2017-6-23 16:08 | 显示全部楼层
串口助手里面也会缺失吗?可以用串口助手看看先
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部