jp2013 发表于 2016-8-24 11:21:34

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

各位好,我串口推信三种方式(轮询,接收中断,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);
      }
非常感谢!

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中断,但因为楼主所接到的任务是串口上不用中断,所以一直苦恼了一天。
希望对各位有帮助。

jp2013 发表于 2016-8-25 16:37:14

新的运行结果,虽然相对慢一点,但结果是正确的

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需要判断处理下。
直接改库还是不太好的,还不如不用它给的函数。
页: [1]
查看完整版本: stm32F411+hal库 串口轮询方式接收丢失字节问题