打印
[应用相关]

关于STM32HAL库串口接受部分的一点疑惑

[复制链接]
444|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2021-2-24 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
背景:
       小弟最近在用103C8处理一个串口的通信问题,需要在200ms以内的时间区间上不断接受并处理均次约200字节的上位机数据,并反馈上位机接受结果(逻辑流水位 + OK or ER)。       数据格式:
       逻辑流水位:若干数据项[parm=value&parm=value][结束标志]

       作了简单的测试,如果使用HAL库的HAL_UART_Receive处理,当字符超过250字节后,频率达到150ms后会死机,应该是过载了。
       我大概有一个方案:
       1:Receive依旧是中断触发,批量接受的方式,不过改写一下HAL库的接受过程。逐字识别出几个关键字的index,放在数组里即可,不再进一步处理。
      2:之后对数据内容的识别、配对、计算、反馈异步放在中断外面,用两套buffer应对。

/////////////我的问题//////////////
1:我的方案可行否?
2:关于HAL_UART_Receive函数的while部分逻辑有疑问,想咨询一下大家。
    2-1:以下摘取了HAL_UART_Receive  函数部分主干代码,重点展示while部分




  • HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t timeout)
  • {
  •    //头部合规性验证部分略....
  •    uint16_t* tmp;
  •    uint32_t tickstart = 0U;
  •     if(huart->RxState == HAL_UART_STATE_READY)//判断是否有数据
  •    {
  •          huart->RxXferCount = Size;
  •          while(huart->RxXferCount > 0U)
  •            {
  •      /****9字节等处理略....*****/
  •     //持续Timeout时间。
  •       if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
  •         {
  •              return HAL_TIMEOUT;//0x03U
  •          }
  •          //pData每循环一次接受一个DR寄存器的数据
  •          *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
  •          huart->RxXferSize++;
  •          huart->RxXferCount--;
  •          }//while end
  •     }//if end
  • }


[color=rgb(51, 102, 153) !important]复制代码





    2-2:我的疑惑是建立在批量读取数据的基础上,即——如何保证每次恰好都能接到正确的数据?
       按照波特率115200在PCLK1为源的情况下,我记得好像是几百K的频率,可MCU的主频72MHz,远大于传输频率。
       按我的理解这里的while会在MCU的频率下持续执行,如果是这样的话,串口接受到的数据除了正确的数据外,应该会有大量空数据。但是实际上没有这些空数据,有人可以帮我解释一下原因吗?

使用特权

评论回复
沙发
wiba| | 2021-3-4 10:51 | 只看该作者
数据量并不大

使用特权

评论回复
板凳
zljiu| | 2021-3-4 10:57 | 只看该作者
应该有可行性

使用特权

评论回复
地板
coshi| | 2021-3-4 11:00 | 只看该作者
我觉得这样做是可以的

使用特权

评论回复
5
aoyi| | 2021-3-4 11:04 | 只看该作者
可以自己做一个小的协议进行判定

使用特权

评论回复
6
drer| | 2021-3-4 11:07 | 只看该作者
大面上看方案没有问题

使用特权

评论回复
7
ayb_ice| | 2021-3-4 11:14 | 只看该作者
老实搞中断吧,中断接收到一个字节后,自己存入数组,分析,超时自己做

他这种逻辑比较适合你做主机,接收从机的数据

使用特权

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

本版积分规则

1216

主题

5366

帖子

12

粉丝