我在网上看到的大多数都是使用终端的,我用终端也可以,但现在改成用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传输过程操作,上位机和单片机倒是可以传输,但是全速运行时不行。 |
哪位大哥有stm32f103c8t6的keil编程实例源码呀?求
STM32H747的串口加DMA
能在一个程序中同时使用TIM的callback和uart的callback函数吗?
TCP客户端 周期性 发送数据,一段时间后会突然停止,是什么原因。
STM32F103VCT6有64K的RAM?
cubemx配置开发板引脚但已经被占用
使用串口双机通信的问题
如何添加一个中断服务函数?
Proteus是否无法正确仿真STM32的开漏输出
Cortex m3内核是很特殊吗,为什么st公司的很多软件比如cubemx.ai唯独不支持m3内核的stm32f1系列
BUSY时,看一下溢出标志位,如果发生溢出,说明全速运行时,由于处理接收数据不当导致数据溢出。发生溢出后,初始化串口解决该问题。分析还是数据通讯上处理不当。自己可以试着抓一下数据过程,分析一下示什么情况下出现该问题。如果单纯的用终端可以,说明自己写的上位机处理不当。只能帮忙分析原因,具体解决还是需要你自己分析实际通讯的数据过程。