OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5834|回复: 11

STM32H743串口实验求助!接收间隔低于10ms就会数据错位

[复制链接]

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
发表于 2023-5-23 17:41:01 | 显示全部楼层 |阅读模式
1金钱
需要用串口高速接收数据,数据发送端频率大约是500Hz,但是目前无法接收到完整的数据包,请问如果使用DMA能否避免这一情况?

最佳答案

查看完整内容[请看2#楼]

可以去下载https://www.armbbs.cn/forum.php?mod=viewthread&tid=91590&extra=page%3D1,他们裸机例程有串口DMA的,你试试看
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-5-24 11:11:02 | 显示全部楼层
blackswan 发表于 2023-5-24 11:00
波特率460800
是的,例程是每接收到一个字节就在中断里发送一个字节,我猜测可能是这一步耗时较长{:3_47 ...

HAL_UART_Transmit在发送一字节时,实际耗费时间会比一字节更长,因为最后会等待TC标志,所以你的程序里多次发送后会导致丢数。
两个方案:
1.中断里发送数据不用HAL_UART_Transmit,另写一个专用的发送函数,先等待TXE标志置位,后往DR赋值,最后就不需要等待TC标志位了。
2.中断里只将数据存入数组,收完一包后置标志,主循环里检测到标志再将这一包数据发出来。(也可参考循环队列)
专治疑难杂症
回复

使用道具 举报

31

主题

107

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2790
金钱
2790
注册时间
2015-12-30
在线时间
342 小时
发表于 2023-5-23 17:41:02 | 显示全部楼层
blackswan 发表于 2023-5-24 10:09
好的!多谢!那我学习一下

可以去下载https://www.armbbs.cn/forum.php? ... &extra=page%3D1,他们裸机例程有串口DMA的,你试试看
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-5-24 09:15:40 | 显示全部楼层
接收哪来的间隔
专治疑难杂症
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
 楼主| 发表于 2023-5-24 09:56:48 | 显示全部楼层

是我说的不清楚,数据发送间隔低于10ms,接收到的数据就会出现错位漏收的情况(直接使用串口通信例程)
回复

使用道具 举报

31

主题

107

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2790
金钱
2790
注册时间
2015-12-30
在线时间
342 小时
发表于 2023-5-24 10:00:04 | 显示全部楼层
最好用DMA,效率能提高很多
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
 楼主| 发表于 2023-5-24 10:09:09 | 显示全部楼层
lophost 发表于 2023-5-24 10:00
最好用DMA,效率能提高很多

好的!多谢!那我学习一下
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-5-24 10:36:01 | 显示全部楼层
blackswan 发表于 2023-5-24 09:56
是我说的不清楚,数据发送间隔低于10ms,接收到的数据就会出现错位漏收的情况(直接使用串口通信例程)

“500Hz”是指每秒500字节吗?虽然不知例程长啥样,但我敢说就算是51单片机也不会出现错位漏收。
专治疑难杂症
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
 楼主| 发表于 2023-5-24 10:43:31 | 显示全部楼层
LcwSwust 发表于 2023-5-24 10:36
“500Hz”是指每秒500字节吗?虽然不知例程长啥样,但我敢说就算是51单片机也不会出现错位漏收。

是2ms发送一次数据包,一包14个字节
//串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                HAL_UART_Transmit(&UART1_Handler,(uint8_t*)aRxBuffer,1,100);        //发送接收到的数据  
        }
}

//串口1中断服务程序
void USART1_IRQHandler(void)                       
{
        u32 timeout=0;
    u32 maxDelay=0x1FFFF;
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntEnter();   
#endif
       
        HAL_UART_IRQHandler(&UART1_Handler);        //调用HAL库中断处理公用函数
       
        timeout=0;
    while (HAL_UART_GetState(&UART1_Handler)!=HAL_UART_STATE_READY)//等待就绪
        {
        timeout++;////超时处理
        if(timeout>maxDelay) break;               
        }
     
        timeout=0;
        while(HAL_UART_Receive_IT(&UART1_Handler,(u8 *)aRxBuffer, RXBUFFERSIZE)!=HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
        {
        timeout++; //超时处理
        if(timeout>maxDelay) break;       
        }
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntExit();                                                                                           
#endif
}

例程是这样的,我也觉得不应该出现错位漏收,但串口助手里确实是这么显示的
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-5-24 10:54:51 | 显示全部楼层
blackswan 发表于 2023-5-24 10:43
是2ms发送一次数据包,一包14个字节
//串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_Handl ...

波特率多少?
我没用过HAL库,看起来有点复杂。
程序是每收到一个字节就在中断里发送一个字节?

专治疑难杂症
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
 楼主| 发表于 2023-5-24 11:00:16 | 显示全部楼层
LcwSwust 发表于 2023-5-24 10:54
波特率多少?
我没用过HAL库,看起来有点复杂。
程序是每收到一个字节就在中断里发送一个字节?

波特率460800
是的,例程是每接收到一个字节就在中断里发送一个字节,我猜测可能是这一步耗时较长
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-7
在线时间
5 小时
 楼主| 发表于 2023-5-24 11:17:24 | 显示全部楼层
LcwSwust 发表于 2023-5-24 11:11
HAL_UART_Transmit在发送一字节时,实际耗费时间会比一字节更长,因为最后会等待TC标志,所以你的程序里 ...

哇!感谢感谢!那我再研究一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 11:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表