问题描述:奇怪的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)
|