問題描述:奇怪的MCU bug
16進制給板子發送數據
比如:
串口助手:發-04 03 01 02 03 0A C5 98
板子 收-04 03 01 02 03 0A C5 98
就能完成的完成數據傳輸
但是發
發-04 03 00 00 00 0A C5 98時
收到的就是
收-04 03 00 00 00 00 00 00
數據流收發沒問題,但是只要是00,就會把后面的數據給抹掉
串口中斷:
- void USART1_IRQHandler(void)
- {
- OSIntEnter();
- HAL_UART_IRQHandler(&huart1);
- user_uart1IT_ReceiveCallback();
-
- OSIntExit();
- }
- void user_uart1IT_ReceiveCallback(void)
- {
- uint8_t temp;
- if((__HAL_UART_GET_FLAG(UART_DEBUG, UART_FLAG_IDLE) != RESET)) //獲取IDLE標志位,idle標志被置位
- {
- __HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除空閑中斷標志位
- HAL_UART_DMAStop(UART_DEBUG); //停止串口DMA功能
-
- temp = huart1.hdmarx->Instance->CNDTR; //得到當前還剩余多少個數據
- uartDMA_data.bits.recive_count = BUFFER_SIZE - temp; //接收數據計數
-
- uartDMA_data.bits.interrupt_idle = ON; // 接受完成標志位置1
-
- }
- }
復制代碼 數據接收服務,放在一個5ms定時一次的定時器中斷里
- void USART1DMA_rx_service(void)
- {
-
- /*在72MHZ系統時鐘工況下,此函數運行時間為無空閑中斷0.78ms-0.81ms;
- 有空閑中斷,需要處理 運行時間為72.114ms*/
- /*將此接收服務判定函數置于中斷中,有較小概率產生數據丟包BUG*/
- /*此任務函數置于定時中斷中,進行循環檢測*/
- if(uartDMA_data.bits.interrupt_idle == ON) //有空閑中斷
- {
- uartDMA_data.bits.interrupt_idle = OFF;
- /*加入臨界段保護-----------------------------------------------------------------------------------------------------------------*/
- CPU_SR_ALLOC();
- CPU_CRITICAL_ENTER();
-
- memset(uartDMA_data.bits.uart_buffer, 0, sizeof(uartDMA_data.bits.uart_buffer)); //清除緩存數據數組
- memcpy(uartDMA_data.bits.uart_buffer, uartDMA_data.bits.rx_buffer, strlen((char *)uartDMA_data.bits.rx_buffer)); //取出數據
- memset(uartDMA_data.bits.rx_buffer, 0, sizeof(uartDMA_data.bits.rx_buffer)); //清空數組
- HAL_UART_Receive_DMA(UART_DEBUG, uartDMA_data.bits.rx_buffer, sizeof(uartDMA_data.bits.rx_buffer)); //重新啟動串口DMA功能
-
- CPU_CRITICAL_EXIT();
- /*加入臨界段保護-----------------------------------------------------------------------------------------------------------------*/
-
- if((DEBUG_USART_ENABLE==1)&&(Modbus_ENABLE==0)){
- /*測試模式,向PC發送接收到的數據*/
-
- }
- if((Modbus_ENABLE==1)&&(DEBUG_USART_ENABLE==0)){ /*進入MODBUS通訊模式*/
-
- uint8_t icnt;
- /*空閑中斷發生,將DMA接收緩存數據轉存至MODBUS數據緩存中*/
- Modbus_data_len = uartDMA_data.bits.recive_count;
- //HAL_UART_Transmit_DMA(UART_DEBUG, (uint8_t *)uartDMA_data.bits.uart_buffer, strlen((char *)uartDMA_data.bits.uart_buffer)); //打印接收到的數據
- ModbusbuffAllow = 0; //modbus緩存寫保護
- for(icnt=0;icnt<Modbus_data_len;icnt++)
- {
- modbus_Rx_buff[icnt] = uartDMA_data.bits.uart_buffer[icnt];
- }
-
- ModbusbuffAllow = 1; //modbus緩存解除寫保護
- /*數據已經寫入modbus緩存*/
- //HAL_UART_Transmit_DMA(UART_DEBUG,modbus_Rx_buff,Modbus_data_len);
- }
-
-
- // Debug_Printf(UART_DEBUG, "\r\n*******************************串口 DMA方式接收打印如下 *****************************\r\n "); HAL_Delay(100);
- //
- // Debug_Printf(UART_DEBUG, "\r\n HAL_UART_Transmit_DMA 庫函數打印\t:"); HAL_Delay(100);
- // HAL_UART_Transmit_DMA(UART_DEBUG, (uint8_t *)uartDMA_data.bits.uart_buffer, strlen((char *)uartDMA_data.bits.uart_buffer)); //打印接收到的數據
- // HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函數打印數組\t\t:"); HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, (char *)uartDMA_data.bits.uart_buffer);
- // HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函數打印字符\t\t:"); HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, "uart MDA Debug printf function");
- // HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函數打印串口接收計數值\t:"); HAL_Delay(100);
- // Debug_Printf(UART_DEBUG, "recive_count: %d\r\n", uartDMA_data.bits.recive_count);
- }
- }
復制代碼
源碼奉上:
test.7z
(818.38 KB, 下載次數: 4)
2023-4-28 18:18 上傳
點擊文件名下載附件
|