硬汉嵌入式论坛

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

[有问必答] STM32F407,多串口通信,长期运行数据帧错误

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-10-29 23:09:30 | 显示全部楼层 |阅读模式
硬汉哥,请教一个问题,搞了一个星期了,实在不知道什么原因。

大概情况:
用的407片子,串口1是485通信,接一个从机设备,开一个定时器,间隔1秒发送一次指令读取从机设备数据,中断接收数据;
串口2是TTL通信,接一个串口设备,这个串口设备100ms自动输出一次数据,407串口中断接收数据。

问题现象:
运行大概十几分钟,串口1(485串口)接收的数据,第一个字节会变成0x00(实际正确数据应该是0x02)。偶尔出现一次后,又正常了,然后运行一段时间后又会出错一次。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107053
QQ
发表于 2022-10-30 00:42:21 | 显示全部楼层
485主要就是发送和接收是否正常切换状态了,排查办法就是直接TTL方式接起来测试下,如果没问题说明就是485状态切换问题,反之你的程序设计有点问题,调试状态看看是否有串口错误标志置位,串口有好几个错误状态可以查看的。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-10-30 08:20:16 | 显示全部楼层
eric2013 发表于 2022-10-30 00:42
485主要就是发送和接收是否正常切换状态了,排查办法就是直接TTL方式接起来测试下,如果没问题说明就是485 ...

好的,多谢硬汉哥!我测试看看。再问下,如果一个系统中其中一个串口接一路485,另外一个串口接TTL,都是采用中断方式接收数据,是不是肯定会存在丢失数据的风险,比如485的收发管脚刚好切换为收数据状态,而此时另外那个TTL串口中断数据来了,CPU去处理该串口中断函数了,这需要一定时间进行处理,而此时485那个串口的从设备早已把数据传送过来了,这种情况下数据肯定就丢失了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107053
QQ
发表于 2022-10-31 03:06:57 | 显示全部楼层
chinahsan 发表于 2022-10-30 08:20
好的,多谢硬汉哥!我测试看看。再问下,如果一个系统中其中一个串口接一路485,另外一个串口接TTL,都是 ...

以115200波特率为例,1个字符差不多就是100us时间,这个时间处理多个中断基本无压力的,两个串口中断完全不会丢失数据。

不放心可以开个DMA
回复

使用道具 举报

4

主题

74

回帖

86

积分

初级会员

积分
86
发表于 2022-10-31 09:03:23 | 显示全部楼层
硬件角度也排查一下,两个设备之间的线是否是双绞线!
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-10-31 10:32:46 | 显示全部楼层
滴滴滴 发表于 2022-10-31 09:03
硬件角度也排查一下,两个设备之间的线是否是双绞线!

485通信线也必须双绞线吗?距离很短,不到一米
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-10-31 10:33:27 | 显示全部楼层
eric2013 发表于 2022-10-31 03:06
以115200波特率为例,1个字符差不多就是100us时间,这个时间处理多个中断基本无压力的,两个串口中断完全 ...

好的,多谢了。比特率用的9600,1个字符差不多要1ms了。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-10-31 22:19:18 | 显示全部楼层
eric2013 发表于 2022-10-30 00:42
485主要就是发送和接收是否正常切换状态了,排查办法就是直接TTL方式接起来测试下,如果没问题说明就是485 ...

硬汉哥,请教下,6路串口都用上,其中5路存在数据收发,1路做为调试串口,怎么样保证每一路都不丢数据,其中最快的一路数据接收频率为100ms。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107053
QQ
发表于 2022-11-1 05:25:50 | 显示全部楼层
chinahsan 发表于 2022-10-31 22:19
硬汉哥,请教下,6路串口都用上,其中5路存在数据收发,1路做为调试串口,怎么样保证每一路都不丢数据, ...

协议简单的,直接DMA即可。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-11-1 07:11:26 来自手机 | 显示全部楼层
eric2013 发表于 2022-11-1 05:25
协议简单的,直接DMA即可。

每一路串口的协议大概10几个字节,不知道算不算简单,每一路都开个DMA吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107053
QQ
发表于 2022-11-1 11:28:46 | 显示全部楼层
chinahsan 发表于 2022-11-1 07:11
每一路串口的协议大概10几个字节,不知道算不算简单,每一路都开个DMA吗?

这个最好自己先测试下程序的负荷,即所有中断全部执行完毕需要多少时间。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-12-12 09:41:06 | 显示全部楼层
485通讯匹配电阻用的多少,如果有那就去掉,不到1m的通讯距离,可以不用。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 08:58 , Processed in 0.342086 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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