F407串口bsp驱动程序中断发送usTxRead 和usTxWrite不相等
本帖最后由 时光逆 于 2024-2-27 15:05 编辑F407串口中断发送数据时,有时候会出现usTxRead 比 usTxWrite多1(多发了1B数据)的问题.有人遇到过吗
这个是因为数据没有及时读取,缓冲满了,发生数据覆盖。
解决办法
1、方法1:及时读取数据。
2、方法2:修改函数UartIRQ的接收部分,满了不再存储新数据
3、方法3:满了,FIFO覆盖
eric2013 发表于 2024-2-28 01:26
这个是因为数据没有及时读取,缓冲满了,发生数据覆盖。
解决办法
感谢佬大回复,您说的是接收缓冲区满了,但是我出问题的地方是中断发送的时候,多发送了一个字节,我的截图里usTxwrite是1722,usTxRead是1723多了1 时光逆 发表于 2024-2-28 09:04
感谢佬大回复,您说的是接收缓冲区满了,但是我出问题的地方是中断发送的时候,多发送了一个字节 ...
按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常用玩法。 eric2013 发表于 2024-2-28 09:08
按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常 ...
按照您的方法试了下,发送数据还是会出现多发一个 eric2013 发表于 2024-2-28 09:08
按照我上面发的代码修改下即可。喜欢覆盖就用覆盖,喜欢阻塞等待,就用等待。这两个也是RTOS的消息队列常 ...
按照您的方法修改拉代码,还是会出现多发1个字节的情况
时光逆 发表于 2024-2-28 16:02
按照您的方法修改拉代码,还是会出现多发1个字节的情况
我的问题,搞错了,前面回复的是接收,跟发送没关系。
对于发送,你展示的这个代码不对,标准库看此贴:
标准库bsp_uart_fifo.c里面串口发送函数UartSend修正完善
https://www.armbbs.cn/forum.php?mod=viewthread&tid=95694&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2024-2-28 17:09
我的问题,搞错了,前面回复的是接收,跟发送没关系。
对于发送,你展示的这个代码不对,标准库看此贴 ...
硬汉老师你好,可以在你们提供的bsp_uart_fifo的驱动程序基础上,将串口的发送函数改成阻塞发送吗? frankff 发表于 2024-2-28 22:55
硬汉老师你好,可以在你们提供的bsp_uart_fifo的驱动程序基础上,将串口的发送函数改成阻塞发送吗?
阻塞方式,不使用这个驱动更方便,设置发送DR寄存器,等待DR发送完成。 我看硬汉的BSP历程bsp_uart_fifo V5到V7都是一样的单字节中断接收,没用DMA,这个有啥优缺点么? 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
eric2013 发表于 2024-4-10 08:30
这个驱动我们一直都不使用DMA的。
这个驱动用在各种串口协议解析的场合非常方便,比DMA方式方便很多, ...
的确是比较方便,就是个问题,如果8个串口都使用,会不会MCU资源耗费很多 zbq 发表于 2024-4-10 08:45
的确是比较方便,就是个问题,如果8个串口都使用,会不会MCU资源耗费很多
F4或者H7的话,绰绰有余。 今天用stm32 cubeMX生成stm32f746功能,发现 uart上面有一个选项“modbus communication ”选项,但是选择这个之后发现,GPIO只剩一个发送管脚了,这个是什么操作呢?有了解的么? zbq 发表于 2024-4-18 10:21
今天用stm32 cubeMX生成stm32f746功能,发现 uart上面有一个选项“modbus communication ”选项,但是选择 ...
这个功能不影响引脚,是个超时处理功能。 eric2013 发表于 2024-4-19 08:34
这个功能不影响引脚,是个超时处理功能。
是的,查了手册,F746有一个接收超时寄存器配置可以用于modbus帧超时判定,产生超时中断,这样就不再需要定时器去计时了,
页:
[1]