OpenEdv-开源电子网

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

如何避免两个任务同时占用同一串口进行数据收发??

[复制链接]

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2018-4-11 14:46:51 | 显示全部楼层 |阅读模式
10金钱
最近在做一个使用RS485对目标设备进行数据收发的项目,
其中项目有两个任务:
1、串口1接收到数据以后,向串口2发送串口1接收到的数据


2、串口2定时对相连接的外设进行数据收发

其中要求任务1、任务2优先级并无要求,即只需保持任务收发统一完整性就行了

我现阶段使用的是STM32103C8系列芯片,使用的是搭建 FRTOS系统
项目已经建了一个定时器,到时间后触发信号量来实行任务2
串口1接收中断函数也建了信号量,串口1接收到数据就触发信号量来实行任务1

遇到的问题:
当串口1没接收到数据时,任务2能够正常运行;
当串口1接收到数据时,任务1、任务2都卡死没反应了


求有经验好心人,提供解决思路或者类似的帖子链接!!!!
只求任何一个任务,数据收发完整即可,即等任务1接收完,再操作任务2也行


最佳答案

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

感谢诸位提供的思路, 前几天这个问题我找到一个算是妥协的方案。 首先,我这个项目需求对定时的实时性要求还是有的,需要对外设设备定时5秒钟读取一帧数据。 而若串口1收到数据,也要向外设设备通过串口2下发数据。 这其中必然不能回避的情况就是, 在某一个时间点,定时任务对串口2下发数据,而串口1又收到数据需要向串口2下发数据 (1)我尝试过对串口2的访问添加互斥信号量来保护线程,结果是当串口1有数据接收了, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
 楼主| 发表于 2018-4-11 14:46:52 | 显示全部楼层
感谢诸位提供的思路,
前几天这个问题我找到一个算是妥协的方案。
首先,我这个项目需求对定时的实时性要求还是有的,需要对外设设备定时5秒钟读取一帧数据。
而若串口1收到数据,也要向外设设备通过串口2下发数据。

这其中必然不能回避的情况就是,
在某一个时间点,定时任务对串口2下发数据,而串口1又收到数据需要向串口2下发数据


(1)我尝试过对串口2的访问添加互斥信号量来保护线程,结果是当串口1有数据接收了,没获得信号量的话就任务搁置了没响应,当信号量空闲时,串口1接收到的数据并没有立即下发,初步分析应该某些逻辑没处理好。而这个处理手段,缺点是打断了定时任务的完整性,间断串口1接收的数据多了,以后的确会影响到定时任务的连续性

(2)最终,我采取了以下的处理思路:

两个任务,
A任务用于串口1的数据监听,在串口中断函数添加二值信号量,释放信号量,A任务启动用于校验解析数据得到各种标志位
B任务用于串口2对外设设备的数据交互,开启定时器后,进行数据交互,一个采集周期后,再添加对A任务的标志位处理子函数。通过这个B任务的时序逻辑来避免了串口2的占用问题。每次定时任务后都执行对A任务解析出的标志位操作函数。

这样的操作,缺点是,当串口1有数据的时候,需要在一个定时任务周期结束后才能进行响应。而本项目的定时是5秒钟,时间短,所以本人觉得这一点延时还是可以接收的。
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
 楼主| 发表于 2018-4-11 14:47:40 | 显示全部楼层
二值信号量?邮箱?
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-2-11
在线时间
53 小时
发表于 2018-4-11 14:57:07 | 显示全部楼层
额 你可以试试这样做,当串口1收到一包完整的数据之后关闭控制串口2的定时器,发送串口1收到的数据,发送完成后,开启定时器
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-4-11 15:08:42 | 显示全部楼层
如果定时发送对时间精准度不过分要求,定时用延时函数,然后发送用互斥锁就可以了
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-11 15:23:17 | 显示全部楼层
本帖最后由 xyl210xyl 于 2018-4-11 15:26 编辑

方法1.加互斥锁,资源抢占多线程必须做好保护
方法2.串口独立线程统一管理
方法3.硬件串口FIFO管理
方法4.串口硬件中断


方法N多种,就看有没有要解决的心
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-17 12:12:43 来自手机 | 显示全部楼层
每次调用串口发送前,先判断串口是否空闲。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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