-
/* UARTx 接收管理 */
-
static void JC_start_Receive_IT(void) //启用中断管理.
-
{
-
uint8_t idx = 0;
-
HAL_StatusTypeDef result;
-
-
do {
-
result = HAL_UART_Receive_IT(JCHander, rx_buffer, rx_len); //这里总是返回 Busy状态.
-
if ((HAL_OK != result)) {
-
HAL_Delay(1);
-
idx++;
-
}
-
} while ((HAL_OK != result) && (idx < 5));
-
}
-
-
void init_JC_env(void)
-
{
-
//启用异步接收模式.
-
enable_rx_tx_JC(true); // RX mode;
-
JC_start_Receive_IT();
-
}
-
-
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
-
{
-
__HAL_UART_CLEAR_OREFLAG(huart); //这里经常被调用到, 实际查找调用时, 出现的错误码为
-
//HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */
-
}
-
-
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
-
{
-
if (huart == JCHander)
-
{
-
bRxOK = true;
-
}
-
}
-
-
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
-
{
-
if (huart == JCHander)
-
{
-
enable_rx_tx_JC(true); // RX mode;
-
JC_start_Receive_IT();
-
}
-
}
-
-
bool load_JC_data(uint32_t timeout)
-
{
-
HAL_StatusTypeDef result;
-
-
enable_rx_tx_JC(false); // TX mode;
-
bRxOK = false;
-
rx_len = sizeof(JC_DATA_T);
-
-
result = HAL_UART_Transmit_IT(JCHander, (uint8_t *)frame_qry_data, ARRAYSIZE(frame_qry_data));
-
if (HAL_OK != result ) {
-
enable_rx_tx_JC(true); // RX mode;
-
return false;
-
}
-
-
uint32_t tick_now = HAL_GetTick();
-
while ((HAL_GetTick() - tick_now) < timeout) {
-
if (bRxOK) {
-
if (proc_JC_data()) {
-
-
return true;
-
}
-
}
-
HAL_Delay(100);
-
}
-
return false;
-
}
从 行 8 / 25 最终确定的原因是: rx_len的字节数应该是设小了, 最终没有收完. 后面看一下, 果然是结构体设置错误, 低级错误啊, 白白浪费半小时