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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版