OpenEdv-开源电子网

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

STM32MINI板 FreeModbus从机 主机裸机移植

  [复制链接]

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2016-1-10
在线时间
136 小时
发表于 2019-8-7 17:41:01 | 显示全部楼层 |阅读模式
首先感谢原子哥 八度大神@正点原子 @八度空间
整了一个月,FreeModbus初步明白了个大概,菜鸟第一次发技术帖如有错误请见谅
个人研究所以比较懒,有现成的代码直接就拿来用了

硬件STM32MINI板
串口1调试
DS0 DS1闪烁

从机软件移植
官方下载的freemodbus-1.6v版本主机主要修改portevent.c portserial.c porttimer.c 三个文件
可以在port.c中修改寄存器的数量和内容
目前可以实现功能码01 03 04 06 具体测试命令可见README.txt文本
开始的学习文档是清华大学杨更更的《MODBUS软件开发实战指南》扫描档https://pan.baidu.com/s/1Z1_CGoWfgerEr9UQg8JDsA

从机代码移植参考
https://blog.csdn.net/daniellee_ustb/article/details/8721883?utm_source=tuicool&utm_medium=referral
http://www.openedv.com/forum.php?mod=viewthread&tid=69081&highlight=MODBUS

主机软件移植
参靠文献《modbus主机1.6.0使用说明》
代码移植参考
https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32
裸机移植注意需要模拟事件通知机制 我直接用下列代码代替了
  1. //模拟事件
  2.         eMBMasterReqWriteCoil(0x0A,0xF0F0,0xFF00,-1);        //往从机某个线圈写数据       
  3.         xMBMasterRTUTimerExpired();//定时器服务函数
复制代码

主机主要修改portevent_m.c portserial_m.c porttimer_m.c 三个文件








串口MDDBUS主机 8.7.zip

7.08 MB, 下载次数: 4385

串口MDDBUS 从机 7.16.zip

4.82 MB, 下载次数: 5116

FreeModbus_Slave-Master-RTT-STM32-master.zip

2.02 MB, 下载次数: 1773

freemodbus-v1.6.zip

4.19 MB, 下载次数: 2767

modbus主机1.6.0使用说明.pdf

154.63 KB, 下载次数: 654

MODBUS规约中文说明书.pdf

322.74 KB, 下载次数: 543

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2022-3-14
在线时间
5 小时
发表于 2022-5-30 15:38:25 | 显示全部楼层
本帖最后由 soledadvb 于 2022-5-30 15:49 编辑

有一个bug。修改某个保持寄存器的内容时,只会保留低8位,高8位会被错误的设置成00。解决方法是将port.c文件里的这一行usRegHoldingBuf[iRegIndex] = *pucRegBuffer++;  修改成usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;  也就是在=前面添上|
回复 支持 1 反对 0

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2016-1-10
在线时间
136 小时
 楼主| 发表于 2019-8-7 17:44:51 | 显示全部楼层
补发一个文档

MODBUS入门讲解-新手必看.pdf

67.96 KB, 下载次数: 528

回复 支持 反对

使用道具 举报

5

主题

131

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2018-3-5
在线时间
724 小时
发表于 2019-8-7 19:02:32 | 显示全部楼层
支持一下!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-7-3
在线时间
15 小时
发表于 2019-9-23 17:50:41 | 显示全部楼层
很好用,支持一下
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2017-9-8
在线时间
98 小时
发表于 2019-10-24 00:10:16 | 显示全部楼层

感谢!很好用,支持一下
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-5-7
在线时间
61 小时
发表于 2019-11-5 12:43:56 | 显示全部楼层
给力,支持一下!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-11-9
在线时间
5 小时
发表于 2019-11-10 00:01:43 | 显示全部楼层
非常感谢分享,很不错!!!
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2016-1-28
在线时间
134 小时
发表于 2019-12-4 08:50:19 | 显示全部楼层
谢谢楼主分享。上次看到有个人把主从机合并在一起的程序呢。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-5-6
在线时间
6 小时
发表于 2019-12-4 17:16:30 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-7-2
在线时间
12 小时
发表于 2020-1-14 14:52:36 | 显示全部楼层
支持一下,学习咯
回复 支持 反对

使用道具 举报

6

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
807
金钱
807
注册时间
2015-6-11
在线时间
116 小时
发表于 2020-5-2 23:19:00 | 显示全部楼层
感谢,学习了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-5-15
在线时间
1 小时
发表于 2020-5-15 09:03:23 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-2-14
在线时间
3 小时
发表于 2020-5-15 09:47:44 | 显示全部楼层
很好啊 ,受益匪浅
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-5-28
在线时间
9 小时
发表于 2020-6-6 09:14:27 | 显示全部楼层
您好!有点不懂,在portserial.c文件中怎么把485使能都屏蔽了?
void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable)
{
          /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
                if(xRxEnable)
                        {
                                USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
                                //GPIO_ResetBits(GPIOD,GPIO_Pin_1);//485低电平接受??????
                        else
                        {
                                USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
                                //GPIO_SetBits(GPIOD,GPIO_Pin_1);//485高电平发射??????
                        }
                       
                        if(xTxEnable)
                        {
                                USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
                                //GPIO_SetBits(GPIOD,GPIO_Pin_1);//485低电平接受??????
                        }
                        else
                        {
                                USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
                                //GPIO_ResetBits(GPIOD,GPIO_Pin_1);//485高电平发射??????
                        }
}
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-5-28
在线时间
9 小时
发表于 2020-6-6 09:16:07 | 显示全部楼层

您好!有点不懂,在portserial.c文件中怎么把485使能都屏蔽了?屏蔽掉了怎么控制485芯片接受和发射呢?
void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable)
{
          /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
                if(xRxEnable)
                        {
                                USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
                                //GPIO_ResetBits(GPIOD,GPIO_Pin_1);//485低电平接受??????
                        else
                        {
                                USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
                                //GPIO_SetBits(GPIOD,GPIO_Pin_1);//485高电平发射??????
                        }
                        
                        if(xTxEnable)
                        {
                                USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
                                //GPIO_SetBits(GPIOD,GPIO_Pin_1);//485低电平接受??????
                        }
                        else
                        {
                                USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
                                //GPIO_ResetBits(GPIOD,GPIO_Pin_1);//485高电平发射??????
                        }
}
屏蔽掉了怎么控制485芯片接受和发射呢?
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2016-1-10
在线时间
136 小时
 楼主| 发表于 2020-6-11 22:02:19 | 显示全部楼层
dengdai1399 发表于 2020-6-6 09:16
您好!有点不懂,在portserial.c文件中怎么把485使能都屏蔽了?屏蔽掉了怎么控制485芯片接受和发射呢?
...

我没有用485信号,用的是串口,你可以加上控制
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-6-29
在线时间
16 小时
发表于 2020-8-25 10:25:06 | 显示全部楼层
老铁,我下载了你的串口MODBUS主机8.7,发现可以发送,但是串口接收不到数据,不知道什么情况,
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2016-1-10
在线时间
136 小时
 楼主| 发表于 2020-8-26 15:31:30 | 显示全部楼层
Zeoray 发表于 2020-8-25 10:25
老铁,我下载了你的串口MODBUS主机8.7,发现可以发送,但是串口接收不到数据,不知道什么情况,

你看一下readme.txt,那里有我测试用的命令
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2015-9-21
在线时间
44 小时
发表于 2020-8-26 19:16:30 | 显示全部楼层
楼主你好!我近期也在借鉴RTT那个例程做非系统主机移植,刚才看了一下你的主机代码,测试了一遍,发送指令没什么问题,但是在错误反馈这边与我的一样,超时错误、非法寄存器地址错误等都显示的是MB_MRE_NO_ERR  测试过RTT的错误反馈很好,没有一点问题
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-5-26
在线时间
17 小时
发表于 2020-10-6 00:14:30 | 显示全部楼层
楼主你好!我这里用了您的主机程序,发现主机是可以发送指令,但是接收的时候好像根本收不到回复。
我debug了一下,发现只能收到第一个数据,就是从机的地址,然后后面的数据基本收不到,请问这个问题应该要怎么解决?谢谢!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-8-14
在线时间
10 小时
发表于 2020-10-17 17:22:52 | 显示全部楼层
你这个只是在查询函数里加了预先编写好的LED灯控制函数,而且还有很长时间的延时,玩玩可以,但是做项目中,不会应用吧
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2020-8-19
在线时间
12 小时
发表于 2020-10-20 16:12:16 | 显示全部楼层
你好 你有读写保持寄存器得操作吗  可以看下吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-11-1
在线时间
4 小时
发表于 2020-11-6 10:39:41 | 显示全部楼层
你好啊楼主,请问裸机怎么才能提取从机的数据到屏幕上显示呢
回复 支持 反对

使用道具 举报

5

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2019-10-7
在线时间
36 小时
发表于 2020-12-2 12:09:52 | 显示全部楼层
感谢大佬分享,从机收到主机发送的数据后,如何显示在液晶屏上呢?
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2020-11-1
在线时间
32 小时
发表于 2021-4-17 12:56:33 | 显示全部楼层
本帖最后由 1030503514 于 2021-4-17 13:14 编辑

前辈们,请教一个问题,为什么我在移植楼主主机到我自己的freemodbus从机的时候,出现了图一下面问题,c文件有加进去,路径也包含了。按f12有会出现图二下面的问题
1618635293(1).jpg
1618635493(1).jpg
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-4-29
在线时间
5 小时
发表于 2021-8-23 16:23:43 | 显示全部楼层
谢谢楼主分享。上次看到有个人把主从机合并在一起的程序呢。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-7-6
在线时间
5 小时
发表于 2021-8-24 10:47:42 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2019-7-29
在线时间
101 小时
发表于 2021-11-28 13:48:47 | 显示全部楼层
你好楼主,为什么主站移植到rtt会卡死呢程序
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-11-19
在线时间
1 小时
发表于 2021-12-2 14:09:24 | 显示全部楼层
收藏,谢谢!!!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2023-10-10
在线时间
4 小时
发表于 2023-10-12 21:09:08 | 显示全部楼层
请问有用HAL库的freemodbus从机移植吗?
回复 支持 反对

使用道具 举报

9

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
742
金钱
742
注册时间
2014-7-8
在线时间
97 小时
发表于 2024-4-5 15:51:24 | 显示全部楼层
谢谢楼主分享,收藏
回复 支持 反对

使用道具 举报

22

主题

146

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3951
金钱
3951
注册时间
2015-4-18
在线时间
399 小时
发表于 2024-4-15 15:30:38 | 显示全部楼层
有数据 但数据是乱的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-9 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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