硬汉嵌入式论坛

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

[其它] stm32用ucos实现多路485通讯框架怎么写?

[复制链接]

40

主题

269

回帖

389

积分

高级会员

积分
389
发表于 2026-1-21 19:48:51 | 显示全部楼层 |阅读模式
实现多路modbus协议,协议地址内容是一样的,建立多个任务,用相同的协议实现函数?各个任务间加个信号量?请教下这个框什么样的比较合理?就是达到某些地方修改了,只需修改这一个地方就可以了。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121120
QQ
发表于 2026-1-22 01:08:31 | 显示全部楼层
使用我们开源分享的modbus协议就行,每个485接口,例化一个modbus的C文件,每个文件不用大改,在每个函数前面加个static,限制作用域,仅把需要外部调用的做个专门的函数名字即可。
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-22 10:55:51 | 显示全部楼层
eric2013 发表于 2026-1-22 01:08
使用我们开源分享的modbus协议就行,每个485接口,例化一个modbus的C文件,每个文件不用大改,在每个函数前 ...

谢谢回复!就是每个45口得开辟的内存区域都是独立的?
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2026-1-23 08:52:48 | 显示全部楼层
我觉得你如果你地址内容一样,如果是访问同一个存储区 ,可以试试消息队列,将不同485接收到的数据帧弄到队列里,队列消息除了最原始的接收帧,里面再添加上来自于哪一个485的标志,然后一个任务统一处理调用modbus 解析代码,最后将解析出来的结果发送至队列消息中那个485,这里你可以再创建一个消息队列+发送任务,与接收队列同理
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2026-1-23 09:53:06 | 显示全部楼层
楼主是要搞主机还是从机啊,交流一下
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121120
QQ
发表于 2026-1-23 10:20:36 | 显示全部楼层
zhengwending 发表于 2026-1-22 10:55
谢谢回复!就是每个45口得开辟的内存区域都是独立的?

对,如果你要同时使用,内存区就是要独立都配一套。
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-23 19:43:36 | 显示全部楼层
244141084 发表于 2026-1-23 09:53
楼主是要搞主机还是从机啊,交流一下

从机    学习
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-23 19:50:04 | 显示全部楼层
eric2013 发表于 2026-1-23 10:20
对,如果你要同时使用,内存区就是要独立都配一套。

谢谢回复!还有一点,用的ucos,中断接收数据帧,3.5字符认为一帧,发送一个信号量。不局限于modbus协议。也许接收间隔很短,任务还没处理完上一帧数据,中断又接收到数据了,接收的每一帧数据长度很短或很长,为了不丢失接收的数据,接收要开辟接收数组?每个都255,那这占很多。就是想着跟两个事情一样,一个只管接收,一个只管处理,这样数据帧不丢失,接收一个,处理一个,这会丢帧,这种要怎么去设计结构呢?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121120
QQ
发表于 2026-1-24 10:15:28 | 显示全部楼层
zhengwending 发表于 2026-1-23 19:50
谢谢回复!还有一点,用的ucos,中断接收数据帧,3.5字符认为一帧,发送一个信号量。不局限于modbus协议 ...

这个完全不用担心,Modbus是主从方式的,一问一答,基本没有任务还没处理完上一帧数据,中断又接收到数据的情况。你完全可以接受并处理后再应答
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2026-1-24 20:06:17 | 显示全部楼层
zhengwending 发表于 2026-1-23 19:50
谢谢回复!还有一点,用的ucos,中断接收数据帧,3.5字符认为一帧,发送一个信号量。不局限于modbus协议 ...

串口配置为循环DMA+空闲中断+半完成+完成中断+队列
然后modbus库用nanomodbus
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-25 19:34:07 | 显示全部楼层
eric2013 发表于 2026-1-24 10:15
这个完全不用担心,Modbus是主从方式的,一问一答,基本没有任务还没处理完上一帧数据,中断又接收到数据 ...

嗯 如果不局限于modbus呢
回复

使用道具 举报

5

主题

116

回帖

131

积分

初级会员

积分
131
发表于 2026-1-25 20:46:55 | 显示全部楼层
ucos自带了中间件uc/modbus,你可以看看  uC-Modbus
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121120
QQ
发表于 2026-1-26 00:31:43 | 显示全部楼层
zhengwending 发表于 2026-1-25 19:34
嗯 如果不局限于modbus呢

如果一般的速度,消息队列,FIFO就可以。

如果速度比较快,推荐上DMA,配合DMA双缓冲比较好
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-26 09:07:35 | 显示全部楼层
wangyao 发表于 2026-1-25 20:46
ucos自带了中间件uc/modbus,你可以看看  uC-Modbus

ok  谢谢回复!
回复

使用道具 举报

40

主题

269

回帖

389

积分

高级会员

积分
389
 楼主| 发表于 2026-1-26 09:08:01 | 显示全部楼层
CacheRivulet 发表于 2026-1-24 20:06
串口配置为循环DMA+空闲中断+半完成+完成中断+队列
然后modbus库用nanomodbus

ok  谢谢回复! 去学习下
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-24 07:23 , Processed in 0.051940 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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