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

请教一下stm32 hal串口iap 上位机与单片机通信遇到的问题

[复制链接]
fengdao 提问时间:2022-3-24 20:13 / 未解决
不知道是不是因为dma的问题,还是hal库使用的问题,我用单片机可以和xshell终端使用ymodem协议传输bin文件,上位机可以和串口助手使用ymodem传输文件,但是我用单片机和上位机连接在一起,就出错了,第一次握手成功,单片机收到了数据,然后返回指令ACK C,但是上位机同步读取,读取的数据还是C(应该先是ACK)校验就没法通过了。

我看别人分享的源码,ymodem接收
  1. /**
  2.   * @brief   从发送端接收一个字节
  3.   * @param  c: 接收字符
  4.   *         timeout: 超时时间
  5.   * @retval 0:成功接收
  6.   *         1:时间超时
  7.   */
  8. static int32_t Receive_Byte(uint8_t *c, uint32_t timeout)
  9. {
  10.     while (timeout-- > 0)
  11.     {
  12.         if (SerialKeyPressed(c) == 1)
  13.         {
  14.             return 0;
  15.         }
  16.     }
  17.     return -1;
  18. }
复制代码
请问一下,hal库中没有USART_GetFlagStatus(), 用哪个代替好?__HAL_UART_GET_FLAG吗?还是用HAL_UART_Receive()带有超时的,但我尝试使用这两个都有问题,
我也是用上面类似的方法直接判断usart中断中的Rx_Flag是否为1,和上位机通信有问题,是不是这里的问题导致的?
因为手动调试单片机和上位机是可以一起传输的,但是要全速运行就不行了...



收藏 评论9 发布时间:2022-3-24 20:13

举报

9个回答
废鱼 回答时间:2022-3-25 09:03:03

楼主可以用中断方式接收,或者用带有延时的,延时尽量少一些。1000左右。

fengdao 回答时间:2022-3-25 09:22:00

废鱼 发表于 2022-3-25 09:03
楼主可以用中断方式接收,或者用带有延时的,延时尽量少一些。1000左右。
...

我就是用的串口空闲中断接收的

鹿森 回答时间:2022-3-25 09:37:27

爱丁堡

废鱼 回答时间:2022-3-25 13:31:57

fengdao 发表于 2022-3-25 09:22
我就是用的串口空闲中断接收的

为什么用的是空闲中断呢?

fengdao 回答时间:2022-3-25 13:36:24

废鱼 发表于 2022-3-25 13:31
为什么用的是空闲中断呢?

串口2中断中,不定长数据,这个没影响把?和上位机通信不行


    //空闲中断  如果接收到了一帧的数据
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET))  
    {   
        /*清除状态寄存器和串口数据寄存器*/
        __HAL_UART_CLEAR_IDLEFLAG(&huart2); 

        //temp = huart2.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
        //temp = huart2.Instance->DR; //读取数据寄存器中的数据

        /*失能DMA接收   等于上面两步*/
        HAL_UART_DMAStop(&huart2);  

        /*读取接收长度,总大小-剩余大小*/
        //temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);// 获取DMA中未传输的数据个数   
        //这句和上面那句等效
        temp = huart2.hdmarx->Instance->CNDTR; 
        Rx_Len = Rx_Max - temp; 

        /*接收标志位置1*/
        Rx_Flag=1;  

        /*使能接收DMA接收*/
        //改:
        HAL_UART_Receive_DMA(&huart2,Rx_Buf,Rx_Max);  
    }
废鱼 回答时间:2022-3-25 17:08:23

DMA接收数据,然后通过空闲中断处理DMA中的数据。楼主的串口是同步模式吗?最好是打印一下接收到的内容,和下次接收到的内容,看看是不是因为处理空闲数据时,部分数据丢失。

fengdao 回答时间:2022-3-25 18:58:14

废鱼 发表于 2022-3-25 17:08
DMA接收数据,然后通过空闲中断处理DMA中的数据。楼主的串口是同步模式吗?最好是打印一下接收到的内容 ...

[md]数据没有丢失,是在检验接收的数据包时,很多用的HAL_UART_Receive(),我用直接卡死了,是HAL_UART_STATE_BUSY_RX

我下面这样修改就直接卡死了

while(HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY)
  {  
    HAL_Delay(100);   
  }   

  status=HAL_UART_Receive(&huart2,&char1,1,1000);
废鱼 回答时间:2022-3-26 08:27:52

fengdao 发表于 2022-3-25 18:58</p>
<p>[md]数据没有丢失,是在检验接收的数据包时,很多用的HAL_UART_Receive(),我用直接卡死了,是HAL_UA ...

[md]发生了溢出导致的,说明上次有数据丢失了。建议用中断模式操作,不要用DMA。收到空闲时处理一下数据。接收完成后,重新开启中断。发生溢出后,只能重新初始化串口解决了。

fengdao 回答时间:2022-3-29 15:51:09

没有明白,没有数据丢失,哪里溢出了?我就是用的串口空闲中断啊,接收完成开启啊,你没看我前面说的啊,

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