你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
fengdao 提问时间:2022-3-26 00:46 / 未解决

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

收藏 评论1 发布时间:2022-3-26 00:46

举报

1个回答
废鱼 回答时间:2022-3-26 09:05:58

BUSY时,看一下溢出标志位,如果发生溢出,说明全速运行时,由于处理接收数据不当导致数据溢出。发生溢出后,初始化串口解决该问题。分析还是数据通讯上处理不当。自己可以试着抓一下数据过程,分析一下示什么情况下出现该问题。如果单纯的用终端可以,说明自己写的上位机处理不当。只能帮忙分析原因,具体解决还是需要你自己分析实际通讯的数据过程。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版