
我在网上看到的大多数都是使用终端的,我用终端也可以,但现在改成用c#串口上位机下载,就出问题了,我之前是使用串口空闲中断来处理的, 在USART2_IRQHandler()中: if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET)) { /清除状态寄存器和串口数据寄存器/ __HAL_UART_CLEAR_IDLEFLAG(&huart2); /失能DMA接收 等于上面两步/ HAL_UART_DMAStop(&huart2); temp = huart2.hdmarx->Instance->CNDTR; Rx_Len = Rx_Max - temp; /接收标志位置1/ Rx_Flag=1;HAL_UART_Receive_DMA(&huart2,Rx_Buf,Rx_Max); } 然后在int32_t Receive_Packet (uint8_t data, int32_t length, uint32_t timeout)函数接收数据包时,判断Rx_flag,Rx_Buf[0],可以和终端通信 但是现在和上位机通信就出现了问题了,上位机采取同步读取字节readByte() 1.上位机第一次正常接收到单片机发送的C,返回的数据01 00 ff ...crc,也对;单片机判断这一帧数据正确,返回ACK,C; 2.上位机此时读到的确是C,不知道是哪里出了问题(我用串口助手调试,发现单片机在收到第一帧之后,确实发送了ACK C;但是之后还是一直在发C,即 ...C C ACK C C C...),导致上位机读取数据出现错误; 我看许多用ymodem的都使用的status=HAL_UART_Receive(),我不判断Rx_flag,Rx_Buf[0],使用这个一直处于HAL_UART_STATE_BUSY_RX状态,status就一直为HAL_BUSY;一直无法通过校验,我temp = huart2.Instance->DR,SR,清空也不行,如果改用HAL_UART_Receive_IT(),效果和不使用这个函数而是直接判断一样。 如果调试模式下按照ymodem传输过程操作,上位机和单片机倒是可以传输,但是全速运行时不行。 |
stm32f407无法配置定时器2为全部dma
求助,使用51单片机和VL6180X传感器测距,结果一直是0是什么原因,能读到ID为0xB4
STM32F103TBU6 封装是VFQFPN36 将PD0和PD1配置成CAN不成功是什么原因
串口DMA + 空闲中断收发 ?
F103RCT6芯片对AFIO->MAPR寄存器写入时出错
使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确的问题
WS2812B怎么显示任意字符 / 图案?
STM32F103RCT6 定位孔 镂空,会影响使用吗?
HAL库1.8.4在做破坏性测试的时候出现g_state永远为busy的情况导致串口通信发送卡死
L9663驱动开发
BUSY时,看一下溢出标志位,如果发生溢出,说明全速运行时,由于处理接收数据不当导致数据溢出。发生溢出后,初始化串口解决该问题。分析还是数据通讯上处理不当。自己可以试着抓一下数据过程,分析一下示什么情况下出现该问题。如果单纯的用终端可以,说明自己写的上位机处理不当。只能帮忙分析原因,具体解决还是需要你自己分析实际通讯的数据过程。