背景:
小弟最近在用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的频率下持续执行,如果是这样的话,串口接受到的数据除了正确的数据外,应该会有大量空数据。但是实际上没有这些空数据,有人可以帮我解释一下原因吗?
|