硬汉嵌入式论坛

 找回密码
 立即注册
查看: 666|回复: 15
收起左侧

[有问必答] F407串口bsp驱动程序中断发送usTxRead 和usTxWrite不相等

[复制链接]

4

主题

24

回帖

36

积分

新手上路

积分
36
发表于 2024-2-27 15:03:53 | 显示全部楼层 |阅读模式
本帖最后由 时光逆 于 2024-2-27 15:05 编辑

F407串口中断发送数据时,有时候会出现usTxRead 比 usTxWrite多1(多发了1B数据)的问题.有人遇到过吗
无标题.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-2-28 01:26:21 | 显示全部楼层
这个是因为数据没有及时读取,缓冲满了,发生数据覆盖。

解决办法
1、方法1:及时读取数据。
2、方法2:修改函数UartIRQ的接收部分,满了不再存储新数据

12.png

3、方法3:满了,FIFO覆盖

24.png



回复

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2024-2-28 09:04:50 | 显示全部楼层
eric2013 发表于 2024-2-28 01:26
这个是因为数据没有及时读取,缓冲满了,发生数据覆盖。

解决办法

感谢佬大回复,您说的是  接收  缓冲区满了,但是我出问题的地方是  中断发送  的时候,多发送了一个字节,我的截图里usTxwrite是1722,usTxRead是1723多了1
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-2-28 09:08:14 | 显示全部楼层
时光逆 发表于 2024-2-28 09:04
感谢佬大回复,您说的是  接收  缓冲区满了,但是我出问题的地方是  中断发送  的时候,多发送了一个字节 ...

按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常用玩法。
回复

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2024-2-28 15:48:18 | 显示全部楼层
eric2013 发表于 2024-2-28 09:08
按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常 ...

按照您的方法试了下,发送数据还是会出现多发一个

多发了1个字节

多发了1个字节

发送函数

发送函数
回复

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2024-2-28 16:02:59 | 显示全部楼层
eric2013 发表于 2024-2-28 09:08
按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常 ...

按照您的方法修改拉代码,还是会出现多发1个字节的情况 PixPin_2024-02-28_15-33-12.png

发送函数

发送函数

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-2-28 17:09:58 | 显示全部楼层
时光逆 发表于 2024-2-28 16:02
按照您的方法修改拉代码,还是会出现多发1个字节的情况

我的问题,搞错了,前面回复的是接收,跟发送没关系。

对于发送,你展示的这个代码不对,标准库看此贴:

标准库bsp_uart_fifo.c里面串口发送函数UartSend修正完善
https://www.armbbs.cn/forum.php? ... 5694&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2024-2-28 22:55:16 | 显示全部楼层
eric2013 发表于 2024-2-28 17:09
我的问题,搞错了,前面回复的是接收,跟发送没关系。

对于发送,你展示的这个代码不对,标准库看此贴 ...

硬汉老师你好,可以在你们提供的bsp_uart_fifo的驱动程序基础上,将串口的发送函数改成阻塞发送吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-2-29 08:33:55 | 显示全部楼层
frankff 发表于 2024-2-28 22:55
硬汉老师你好,可以在你们提供的bsp_uart_fifo的驱动程序基础上,将串口的发送函数改成阻塞发送吗?

阻塞方式,不使用这个驱动更方便,设置发送DR寄存器,等待DR发送完成。
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-4-9 18:45:05 | 显示全部楼层
我看硬汉的BSP历程bsp_uart_fifo V5到V7都是一样的单字节中断接收,没用DMA,这个有啥优缺点么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-4-10 08:30:00 | 显示全部楼层
zbq 发表于 2024-4-9 18:45
我看硬汉的BSP历程bsp_uart_fifo V5到V7都是一样的单字节中断接收,没用DMA,这个有啥优缺点么?

这个驱动我们一直都不使用DMA的。

这个驱动用在各种串口协议解析的场合非常方便,比DMA方式方便很多,所以我们这个驱动一直没有采用DMA

喜欢DMA,可以整这个。

BSP视频教程第21期:轻松一键实现串口DMA不定长收发,支持裸机和RTOS,含MDK和IAR两种玩法,比STM32CubeMX还方便(2022-07-24)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=114241
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-4-10 08:45:09 | 显示全部楼层
eric2013 发表于 2024-4-10 08:30
这个驱动我们一直都不使用DMA的。

这个驱动用在各种串口协议解析的场合非常方便,比DMA方式方便很多, ...

的确是比较方便,就是个问题,如果8个串口都使用,会不会MCU资源耗费很多
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-4-10 09:49:17 | 显示全部楼层
zbq 发表于 2024-4-10 08:45
的确是比较方便,就是个问题,如果8个串口都使用,会不会MCU资源耗费很多

F4或者H7的话,绰绰有余。
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-4-18 10:21:40 | 显示全部楼层
今天用stm32 cubeMX生成stm32f746功能,发现 uart上面有一个选项“modbus communication ”选项,但是选择这个之后发现,GPIO只剩一个发送管脚了,这个是什么操作呢?有了解的么?
微信截图_20240418101918.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-4-19 08:34:06 | 显示全部楼层
zbq 发表于 2024-4-18 10:21
今天用stm32 cubeMX生成stm32f746功能,发现 uart上面有一个选项“modbus communication ”选项,但是选择 ...

这个功能不影响引脚,是个超时处理功能。
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-4-22 08:45:53 | 显示全部楼层
eric2013 发表于 2024-4-19 08:34
这个功能不影响引脚,是个超时处理功能。

是的,查了手册,F746有一个接收超时寄存器配置可以用于modbus帧超时判定,产生超时中断,这样就不再需要定时器去计时了,
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 21:34 , Processed in 0.300094 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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