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

stm32F411+hal库 串口轮询方式接收丢失字节问题

[复制链接]
jp2013 提问时间:2016-8-24 11:21 /
悬赏3ST金币未解决
各位好,我串口推信三种方式(轮询,接收中断,DMA)都使用过了,我的前两种当发的长度超过一定数值后就发生丢字节,DMA没有问题,我用的STM32F411,结合cube生成的工程,哪位帮我看看嘛。
我轮询部分的代码:
while(1){
                while(HAL_UART_Receive(&huart6, (uint8_t *)rx_buffer, 1, 10) != HAL_OK)
                {}
                        HAL_UART_Transmit(&huart6,(uint8_t *)rx_buffer,1,10);
        }
非常感谢!

串口调试结果

串口调试结果
收藏 评论6 发布时间:2016-8-24 11:21

举报

6个回答
jp2013 回答时间:2016-8-24 11:23:11
其他波特率我也试过,9600bits/s也会出错,程序里没有用中断
jp2013 回答时间:2016-8-25 16:32:53
没有热心大神来回复,楼主自己找到一种方法,思路类似于DMA,但不使用中断,就是一直接收数据,等到接收完后再一次发出去,代码附上:
while (1)
  {
                while(HAL_UART_Receive(&huart6, (uint8_t *)rx_buffer+totalRecv, 1, 1000) == HAL_OK)
       {
                          totalRecv++;
                   }
               
                if(totalRecv>0){
                          HAL_UART_Transmit(&huart6,(uint8_t *)rx_buffer,totalRecv,1000);
                          totalRecv = 0;
             }
        }
当然,效率最高的还是DMA中断,但因为楼主所接到的任务是串口上不用中断,所以一直苦恼了一天。
希望对各位有帮助。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 很给力!

查看全部评分

jp2013 回答时间:2016-8-25 16:37:14
新的运行结果,虽然相对慢一点,但结果是正确的
截图01.png
chifen 回答时间:2016-8-26 09:11:38
HAL库你要先定义好你的一个要接收的数组,及可以最大接收到的数据最大长度,比如你设的长度是10,那它只能一次性接收10个数据
废鱼 回答时间:2016-8-26 11:00:05
用中断的方式接收,缓冲区大些。我在用做GSM的时候,我就自己把他的中断改了。改成自己处理接收。
makc 回答时间:2016-9-27 11:34:14
一调用Transmit 就不代表发送ok了,HAL专门有个 HAL_Status  需要判断处理下。
直接改库还是不太好的,还不如不用它给的函数。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版