打印
[应用相关]

请问一下,stm32 ymodem协议终端与上位机的区别

[复制链接]
616|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2022-3-30 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在网上看到的大多数都是使用终端的,我用终端也可以,但现在改成用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传输过程操作,上位机和单片机倒是可以传输,但是全速运行时不行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1522

主题

4618

帖子

6

粉丝