打印
[STM32F1]

串口接收丢失字节问题

[复制链接]
楼主: coderdd
手机看帖
扫描二维码
随时随地手机跟帖
21
mituzu| | 2017-6-22 22:44 | 只看该作者 回帖奖励 |倒序浏览
数据处理真的会让人崩溃

使用特权

评论回复
22
hellosdc| | 2017-6-22 22:44 | 只看该作者
一个字节大约是多长时间会漏掉的?

使用特权

评论回复
23
uiint| | 2017-6-22 22:45 | 只看该作者
以前用过fifo可以解决这个问题的。

使用特权

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

使用特权

评论回复
25
戈卫东| | 2017-6-22 22:50 | 只看该作者
二姨妈你太让人感动了啊。。。。。。

使用特权

评论回复
26
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,那么     ...

这个不是判断遗漏,是判断终止字符,丢字节和这个无关,因为丢的部分是前面的,仿真可以看得到。

使用特权

评论回复
27
mmuuss586| | 2017-6-23 07:56 | 只看该作者
加校验,提高通讯可靠性;

出错了重发;

使用特权

评论回复
28
coderdd|  楼主 | 2017-6-23 07:58 | 只看该作者

这种情况已经排除了,可以无视

使用特权

评论回复
29
coderdd|  楼主 | 2017-6-23 08:00 | 只看该作者
wangdezhi 发表于 2017-6-22 22:41
所有的处理函数都在外部进行设计。

这个内部已经没什么复杂的操作了,我感觉原因肯定不是内部代码多的问题

使用特权

评论回复
30
coderdd|  楼主 | 2017-6-23 08:02 | 只看该作者
gygp 发表于 2017-6-22 22:43
这个只能通过校验实现了。

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

使用特权

评论回复
评论
icecut 2017-6-23 16:18 回复TA
st不会有.这个猜的对. 
31
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);
}

使用特权

评论回复
32
coderdd|  楼主 | 2017-6-23 08:04 | 只看该作者
suzhanhua 发表于 2017-6-22 22:44
串口的优先级是最高的才行

确定是这样么?

使用特权

评论回复
33
sfd123| | 2017-6-23 08:15 | 只看该作者
RX_Buffer[uart_num-2]

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

使用特权

评论回复
34
kingkits| | 2017-6-23 09:08 | 只看该作者
建议使用环形缓冲区,中断只负责处理接收数据到缓冲区,解析数据由普通进程完成

使用特权

评论回复
35
coderdd|  楼主 | 2017-6-23 09:12 | 只看该作者
sfd123 发表于 2017-6-23 08:15
RX_Buffer

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

百分百确定,如果你仔细看代码的话,这个可以忽略,因为这个只是判断\r\n结束字节标志,丢掉的字节其实是前面的重要信息字节。

使用特权

评论回复
36
zhuomuniao110| | 2017-6-23 10:39 | 只看该作者
前排大神讲解的很到位。

使用特权

评论回复
37
沧海の海神| | 2017-6-23 11:44 | 只看该作者
1.把串口中断优先级设置成最高试试,有可能是其他的中断长时间占用CPU导致的。
2.判断/r/n时候应该设置限制条件 uart_num >= 2 否则 RX_Buffer[uart_num-2]可能产生不可预知的结果
3.确认从接收完成一帧 flagReceive = 1;到你应用处理完一帧数据所化的时间, 在这段时间里有没有产生串口接收中断。

使用特权

评论回复
38
yzjgod| | 2017-6-23 13:30 | 只看该作者
也有可能是环形缓存发生数据覆盖

使用特权

评论回复
39
l0p0c| | 2017-6-23 15:35 | 只看该作者
确认一下硬件是不是一直在复位???

使用特权

评论回复
40
涛家柒柒| | 2017-6-23 16:08 | 只看该作者
串口助手里面也会缺失吗?可以用串口助手看看先

使用特权

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

本版积分规则