你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Uart接收漏資料問題

[复制链接]
nickyliu6 提问时间:2022-8-9 15:14 / 未解决
各位好:
最近在研究MCU與感測器結合應用,使用UART進行資料接收,但發現接收端好像來不急接收感測器端吐出來的資料,目前設定的情況是我使用Uart中斷接收的方式,buadrate設定為115200,感測器由0開始計數,但接收端的部份中間固定有幾比資料會遺失,請問能否協助解答?
UART DataBuff[0] = 0x2
UART DataBuff[0] = 0x5
UART DataBuff[0] = 0x8
UART DataBuff[0] = 0x11
UART DataBuff[0] = 0x14
UART DataBuff[0] = 0x17
UART DataBuff[0] = 0x20
UART DataBuff[0] = 0x23


  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
  2. {


  3.                 RxLine++;                     
  4.             DataBuff[RxLine-1]=RxBuff[0];  

  5.             if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxLine-4]==0xff)
  6.             {

  7.                if(RxLine == 8)   
  8.                {
  9.                        printf("RXLen=%d\r\n",RxLine);
  10.                        for(int i=0;i<RxLine;i++)
  11.                        {
  12.                                printf("UART DataBuff[%d] = 0x%d\r\n",i,DataBuff[i]);
  13.                        }
  14.                        memset(DataBuff,0,sizeof(DataBuff));
  15.                        RxLine=0;  
  16.                }

  17.                else if(RxLine > 8)
  18.                {
  19.                        memset(DataBuff,0,sizeof(DataBuff));  
  20.                        RxLine=0;  
  21.                }
  22.             }
  23.         
  24.             RxBuff[0]=0;
  25.             HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuff, 1);
  26. }
复制代码


收藏 评论7 发布时间:2022-8-9 15:14

举报

7个回答
至暗时刻 回答时间:2022-8-10 08:37:36
你这回调函数里的代码执行时间过长,就会导致数据丢包。printf函数就相当于ms延时了。115200的波特率,数据包之间的时间间隔大概在86us左右,也就是说你收到第一个数据之后,86us左右第二个数据就会到达。所以为了不丢包,你要尽可能缩减回调中的时间消耗。
废鱼 回答时间:2022-8-10 09:25:14
if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxLine-4]==0xff)
这里的判读会发生错误,当RXLINE小于4时,取的值已经超出范围。回调函数尽量只做赋值,数据打印或者查询在外部处理。
nickyliu6 回答时间:2022-8-10 10:00:13
废鱼 发表于 2022-8-10 09:25
if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxL ...

針對Rxline<4的情況請問您有比較好的處理方式可以提供參考嗎?
nickyliu6 回答时间:2022-8-10 10:04:38
至暗时刻 发表于 2022-8-10 08:37
你这回调函数里的代码执行时间过长,就会导致数据丢包。printf函数就相当于ms延时了。115200的波特率,数据 ...

除了printf外,想請問是否有其它可以做修改的部份?
废鱼 回答时间:2022-8-10 11:00:44

在外部增加一个RXLINE的判断,目前只能是这样。另外,我感觉应该用UartHandle结构体中接收缓冲区的内容进行操作。
至暗时刻 回答时间:2022-8-10 14:25:14
nickyliu6 发表于 2022-8-10 10:04
除了printf外,想請問是否有其它可以做修改的部份?

个人拙见:你这个回调函数中应该是通过固定的结束符连续四个0xFF来判断数据结束的吧。换个思路可以利用波特率的特性,即每个数据之间的时间间隔是固定的,以这个时间间隔来判定数据是否结束(可以使用定时器进行时间倒数,超时自动认定数据结束)。至于数据的内容正不正确不应在这里进行处理判断,这里只做一件事就是数据的接收。在数据接收完毕的时候可以手动设置一个标志位(表明数据接完了),在其它地方轮询判断该标志位,然后再对缓冲区中的数据进行判断。
xmshao 回答时间:2022-8-12 12:06:12
像这种情况,中断接收的话,建议优化下接收代码,别在中断里耗太久。如果还有其它中断,注意合理安排中断优先级。波特率如果可以下调的话也可调低点。
最好的办法就是DMA接收。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版