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

关于STM32cubemx 串口如何中断接收发来的不定长数据

[复制链接]
张亚飞 提问时间:2017-6-1 16:39 /
阅读主题, 点击返回1楼
收藏 评论47 发布时间:2017-6-1 16:39
47个回答
废鱼 回答时间:2017-6-2 15:04:18
楼主看一下,接收完成后是否就关闭了中断。
张亚飞 回答时间:2017-6-2 16:31:04
安 发表于 2017-6-2 15:04
楼主看一下,接收完成后是否就关闭了中断。

肯定是关了中断的,不然也不会每次在回调函数里边/HAL_UART_Receive_IT(&huart2,Uart2Data,1); 开启下一次中断。    不知道您说这个是什么意思。  因为只接受了一个字节的数据就关闭中断了,所以后边的数据就进不来了?
废鱼 回答时间:2017-6-2 16:46:17
用HAL比较少,我还是用的标准库,我也没有合适的解决方法。修改办法两种,一种该驱动,接收完成也不关闭中断,一种是通过Rx2Buffer定义一个大空间,实时去处理Rx2Buffer中的数据,满足条件以后重新进行接收处理。
HAL_UART_Receive_IT(&huart1,&Rx2Buffer,sizeof(Rx2Buffer))
张亚飞 回答时间:2017-6-2 16:56:58
安 发表于 2017-6-2 16:46
用HAL比较少,我还是用的标准库,我也没有合适的解决方法。修改办法两种,一种该驱动,接收完成也不关闭中 ...

改驱动的方式试过了吗?  我刚才试了下接收完成不关闭中断,好像也没什么区别,不知道哪里的问题。 第二种定义一个大的缓冲区,如果不够接受函数的字节数的话得一直在那等着吧。
废鱼 回答时间:2017-6-3 09:51:33
我改过是可以的。可以通过判断接收剩余字数,这样来确定当前已经接收到多少。
zhao.zhao 回答时间:2017-6-3 10:44:31
张亚飞 发表于 2017-6-2 16:31
肯定是关了中断的,不然也不会每次在回调函数里边/HAL_UART_Receive_IT(&huart2,Uart2Data,1); 开启下一 ...

我觉得每次中断后,没有关闭中断,执行这个函数 HAL_UART_Receive_IT(&huart2,Uart2Data,1); 只是重新设置了下一个数据存放的位置还是从Uart2Data[0] 开始。
张亚飞 回答时间:2017-6-3 20:54:09
安 发表于 2017-6-3 09:51
我改过是可以的。可以通过判断接收剩余字数,这样来确定当前已经接收到多少。 ...

能否贴一下代码,现在工程改的有点乱即使改对了也可能某个地方导致接收中断出现问题,间接导致改驱动不成功。 谢谢。
深谷幽泉 回答时间:2017-6-4 19:19:12
DMA +空闲中断接收数据是正解,不过没试过你们说的cube库,我都是用的标准库
废鱼 回答时间:2017-6-5 08:57:30
我是把下面代码中的关闭中断部分 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);去掉了。
if(--huart->RxXferCount == 0)
    {
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

      /* Check if a transmit process is ongoing or not */
      if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
      {
        huart->State = HAL_UART_STATE_BUSY_TX;
      }
      else
      {
        /* Disable the UART Parity Error Interrupt */
        __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

        huart->State = HAL_UART_STATE_READY;
      }
      HAL_UART_RxCpltCallback(huart);

      return HAL_OK;
    }
张亚飞 回答时间:2017-6-5 09:06:32
深谷幽泉 发表于 2017-6-4 19:19
DMA +空闲中断接收数据是正解,不过没试过你们说的cube库,我都是用的标准库 ...

标准库的接收不用定长接收吧。
张亚飞 回答时间:2017-6-5 09:37:32
安 发表于 2017-6-5 08:57
我是把下面代码中的关闭中断部分 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);去掉了。
if(--huart->RxXf ...

这样改了有别的副作用吗? 比如影响发送。如果关闭了中断的话,那么接收完数据也就没必要再HAL_UART_Receive_IT(&huart1,&RxData,1); 执行这个函数开启下一次中断了吧。
废鱼 回答时间:2017-6-5 09:38:14
这样改就会导致一直在收数据,执行一次就可以了。
张亚飞 回答时间:2017-6-5 10:35:34
安 发表于 2017-6-5 09:38
这样改就会导致一直在收数据,执行一次就可以了。

我是那么改的驱动,为什么就是不行呢。 怎么都做不到发送几个字节就收到几个字节。 下边我贴一下代码,您帮忙看下有问题嘛。
uart_driver.png
开启中断.png
uart.png



张亚飞 回答时间:2017-6-5 10:37:29
张亚飞 发表于 2017-6-5 10:35
我是那么改的驱动,为什么就是不行呢。 怎么都做不到发送几个字节就收到几个字节。 下边我贴一下代码,您 ...

Uart2Data 是 uint8_t UartData[20];

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版