我在网上看到的大多数都是使用终端的,我用终端也可以,但现在改成用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传输过程操作,上位机和单片机倒是可以传输,但是全速运行时不行。
|