OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 八度空间

FreeModbus在STM32上移植

  [复制链接]

32

主题

284

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1335
金钱
1335
注册时间
2014-3-27
在线时间
352 小时
发表于 2016-8-3 14:46:19 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-7-6
在线时间
20 小时
发表于 2016-8-3 20:38:27 | 显示全部楼层

谢谢分享 作为一个小白表示要看吐了。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-4 09:08:18 | 显示全部楼层
Saber酱 发表于 2016-8-3 20:38
谢谢分享 作为一个小白表示要看吐了。

哦???怎么说
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-7-6
在线时间
20 小时
发表于 2016-8-4 11:33:10 | 显示全部楼层

刚接触32没几十天 就用到了modbus了  研究您写的代码 步履维艰
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-4 11:46:23 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-4 12:58:29 | 显示全部楼层
Saber酱 发表于 2016-8-4 11:33
刚接触32没几十天 就用到了modbus了  研究您写的代码 步履维艰

哦,慢慢来呗
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-4 12:58:46 | 显示全部楼层
solo 发表于 2016-8-4 11:46
放一个FreeRTOS版的
http://git.oschina.net/makosolo/FreeModbus-

牛掰
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-4 14:42:22 | 显示全部楼层

比起八度来差远了啊
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-5 08:55:40 | 显示全部楼层
solo 发表于 2016-8-4 14:42
比起八度来差远了啊

我打酱油的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-8-11
在线时间
5 小时
发表于 2016-8-21 00:50:36 | 显示全部楼层
本帖最后由 lennox522 于 2016-8-25 20:11 编辑

八度大神,非常感谢你的付出!我使用你的代码确实可以使用,另外我参考了别人的代码补充了读写线圈和读输入离散寄存器的代码,但是出现了一些问题,写线圈返回正常,读线圈和°输入离散寄存器的时候返回的信息里少了CRC的第二个字节,前面的字节是对的,通过计算发现CRC的第一个字节也是正确的,我刚学stm32两个星期,还没有修复这个BUG的能力,希望八度大神能够抽空帮帮忙修复一下,造福原子论坛的坛友们。工程文件和调试软件以及说明文档都在附件里。再次感谢八度!其实只是调试软件的BUG……把预设接收字节数从0改为超过实际接收的字节数的数值就解决了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-8-11
在线时间
5 小时
发表于 2016-8-21 01:00:24 | 显示全部楼层
lennox522 发表于 2016-8-21 00:50
八度大神,非常感谢你的付出!我使用你的代码确实可以使用,另外我参考了别人的代码补充了读写线圈和读输入 ...

对了,根据modbus协议,各种寄存器的地址是分别从0开始的,通过功能码的区别不同的寄存器,所以我把你定义的寄存器地址重新设置了一下,分别从0开始,不再是叠加的地址。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-21 22:27:15 | 显示全部楼层
lennox522 发表于 2016-8-21 00:50
八度大神,非常感谢你的付出!我使用你的代码确实可以使用,另外我参考了别人的代码补充了读写线圈和读输入 ...

地址可以随便来,只有符合modbus协议标准就可以了,接收少一个字节的问题,你串口是判断TC标志还是TXE标志???
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-22 17:08:14 | 显示全部楼层
八度空间 发表于 2016-3-14 19:41
今天突然发现一个问题,串口使用TXE标志的问题,会漏掉一个字节没发送出来

后面改成TC标志就没问题了, ...

代码里没有把TC改上,今天测试485刚发现。。。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-22 22:06:47 | 显示全部楼层
solo 发表于 2016-8-22 17:08
代码里没有把TC改上,今天测试485刚发现。。。

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-15
在线时间
0 小时
发表于 2016-9-2 13:07:14 | 显示全部楼层
八度大神 按照你的代码直接烧在了板子上结果显示函数错误  不知道如何修改
QQ截图20160902130619.png
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-9-3 10:32:24 | 显示全部楼层
lennox522 发表于 2016-8-21 00:50
八度大神,非常感谢你的付出!我使用你的代码确实可以使用,另外我参考了别人的代码补充了读写线圈和读输入 ...

485模式的问题吧,看63楼
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-9-3 13:23:19 | 显示全部楼层
Bourne 发表于 2016-9-2 13:07
八度大神 按照你的代码直接烧在了板子上结果显示函数错误  不知道如何修改

你的modbus协议用的哪个串口???表示好奇,你发usmart调试组件里边干嘛
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-11-23
在线时间
11 小时
发表于 2016-10-4 20:18:37 | 显示全部楼层
本帖最后由 wd 于 2016-10-4 21:37 编辑

大神我在103上移植的,为什么,接受的数据错误,这个问题要怎么解决啊,请指教?

为什么我注释掉usregaddress++后读还是比写多1,而且返回的数据还不对

为什么我注释掉usregaddress++后读还是比写多1,而且返回的数据还不对
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-10-4 23:52:02 | 显示全部楼层
wd 发表于 2016-10-4 20:18
大神我在103上移植的,为什么,接受的数据错误,这个问题要怎么解决啊,请指教?

你用我的代码还是这样么?我的用着可以耶
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-11-23
在线时间
11 小时
发表于 2016-10-6 18:21:46 | 显示全部楼层
八度空间 发表于 2016-10-4 23:52
你用我的代码还是这样么?我的用着可以耶

是的,我就是用的你的代码,只是重新建了一个F1的工程,然后串口初始化做了微改,其他都没变,还是用的串口中断,而且我仿真了一下,它是接收的数据根本没变,也就是寄存器根本没收到数据,这是哪里有问题
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-10-7 17:23:58 | 显示全部楼层
wd 发表于 2016-10-6 18:21
是的,我就是用的你的代码,只是重新建了一个F1的工程,然后串口初始化做了微改,其他都没变,还是用的串 ...

我用的好好的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-10-7 17:24:31 | 显示全部楼层
wd 发表于 2016-10-6 18:21
是的,我就是用的你的代码,只是重新建了一个F1的工程,然后串口初始化做了微改,其他都没变,还是用的串 ...

将你的串口接收到的数据通过串口打印出来看看和你串口助手发过去的是不是一样的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 09:50:05 | 显示全部楼层
shiqinghai 发表于 2016-6-14 16:35
搞定了,提供的工程里面没加void __aeabi_assert(const char * x1, const char * x2, int x3){}这段代码 ...

我按照这种方法移植了,但是收不到数据,程序编译的时候有3个警告,
1.F:\音乐\22.PNG
显示这个变量没有用到,我是不是哪里删除了什么
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 09:53:55 | 显示全部楼层
图片在这里
22.PNG
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 09:54:14 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 09:50
我按照这种方法移植了,但是收不到数据,程序编译的时候有3个警告,
1.
显示这个变量没有用到,我是不 ...

图片在74楼
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-10-8 12:20:24 | 显示全部楼层

警告不影响运行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 16:23:16 | 显示全部楼层

但是串口助手收不到数据,我是移植大f407上面,串口定时器都配置好了,采用的TC中断,触发第一次中断也加了,assert也按照你的方法加了,但是就是收不到数据,每次拔掉电源的时候会收到00或者FF,好奇怪
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 16:52:55 | 显示全部楼层

我把我移植在F407上的程序发一份,你帮我看一眼哪里设置不对好吗?我已经找了几天了,也没发现到底错在哪。谢谢!

STM32上的ModBus从机的移植.rar

10.88 MB, 下载次数: 604

回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-10-8 18:44:49 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 16:52
我把我移植在F407上的程序发一份,你帮我看一眼哪里设置不对好吗?我已经找了几天了,也没发现到底错在哪 ...

串口配置这个USART_Parity_Even修改为USART_Parity_No这个
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 19:21:34 | 显示全部楼层
八度空间 发表于 2016-10-8 18:44
串口配置这个USART_Parity_Even修改为USART_Parity_No这个

这个应该不影响吧,因为我串口调试助手也选择了偶校验,另外我也按照你的改为了无检验,串口调试助手也改为无校验,但是还是没反应,如图,还有一个问题,从机地址0x0A可以随便吧,0x01也可以吧?
捕获.PNG
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 19:28:18 | 显示全部楼层
八度空间 发表于 2016-10-8 18:44
串口配置这个USART_Parity_Even修改为USART_Parity_No这个

还有,是不是要以16进制发送这个勾上?我试了下,还是没用
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 19:49:47 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 19:28
还有,是不是要以16进制发送这个勾上?我试了下,还是没用

调试modbus最好使用Modbus Poll这软件,能够看着什么错误。操作也方便。楼主提供的代码是没有问题的,我已经将其移植到其他的控制器都正常。
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 20:31:38 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 19:28
还有,是不是要以16进制发送这个勾上?我试了下,还是没用

你的问题找到了,你看一下你的代码里面的这函数BOOL
xMBPortSerialGetByte( CHAR * pucByte )//串口接收一个字节
{
    /* Return the byte in the UARTs receive buffer. This function is called
     * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
     */
        *pucByte =        USART_ReceiveData(USE_USART);
    return TRUE;
}
就知道怎么回事儿了。
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 21:00:54 | 显示全部楼层
本帖最后由 起舞弄清影 于 2016-10-8 21:07 编辑
皇甫仁和 发表于 2016-10-8 20:31
你的问题找到了,你看一下你的代码里面的这函数BOOL
xMBPortSerialGetByte( CHAR * pucByte )//串口接收 ...

这。。。要不是你我永远都发现不了这个错误。。。我改好了以后串口可以收到数据了,但是貌似不对。。。。
捕获1.PNG
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 21:13:30 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 21:00
这。。。要不是你我永远都发现不了这个错误。。。我改好了以后串口可以收到数据了,但是貌似不对。。。。

你用的是什么板子?你确认一下你的晶振频率对不?
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 21:18:44 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 21:00
这。。。要不是你我永远都发现不了这个错误。。。我改好了以后串口可以收到数据了,但是貌似不对。。。。

STM32上的ModBus从机的移植.rar (560.7 KB, 下载次数: 975)
回复 支持 1 反对 0

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 21:20:20 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 21:00
这。。。要不是你我永远都发现不了这个错误。。。我改好了以后串口可以收到数据了,但是貌似不对。。。。

我上传的附件中的晶振频率我更改了,你传的文件的晶振频率是8MHz,我用的是24MHz的晶振
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 21:26:03 | 显示全部楼层
皇甫仁和 发表于 2016-10-8 21:13
你用的是什么板子?你确认一下你的晶振频率对不?

我用的探索板,定时器的代码我也改过了,F407的话定时器溢出时间计算方法是:Tout=((arr+1)*(psc+1))/Ft,不知道F103是不是这样,那么TIM_TimeBaseStructure.TIM_Period =  usTim1Timerout50us这里的usTim1Timerout50us是不是还要加1?

捕获3.PNG
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 21:28:40 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 21:26
我用的探索板,定时器的代码我也改过了,F407的话定时器溢出时间计算方法是:Tout=((arr+1)*(psc+1))/Ft, ...

你就用我上传的代码试一试,你定时器代码我没有做修改,我上传的代码你需要改晶振频率和串口就行
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 21:59:48 | 显示全部楼层
皇甫仁和 发表于 2016-10-8 21:28
你就用我上传的代码试一试,你定时器代码我没有做修改,我上传的代码你需要改晶振频率和串口就行

你用的是那块芯片?我这里打开提示安装工具包?改好后下载不了
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-8 22:27:33 | 显示全部楼层
皇甫仁和 发表于 2016-10-8 21:28
你就用我上传的代码试一试,你定时器代码我没有做修改,我上传的代码你需要改晶振频率和串口就行

使用modbus poll时结果如下,显示从机忙。我用的是我之前的代码
捕获4.PNG
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 22:38:06 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 22:27
使用modbus poll时结果如下,显示从机忙。我用的是我之前的代码

测试截图

测试截图

这是我的截图,测试都正常啊!我用的STM32F407IGT6 ,MDK5.21做的测试。
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-9 09:47:23 | 显示全部楼层
皇甫仁和 发表于 2016-10-8 21:28
你就用我上传的代码试一试,你定时器代码我没有做修改,我上传的代码你需要改晶振频率和串口就行

还是没用,我把你的串口代码拷贝到我的工程,修改串口号,晶振也改为探索板上的8M,还是不行,
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-11-23
在线时间
11 小时
发表于 2016-10-9 13:57:20 | 显示全部楼层
八度空间 发表于 2016-10-7 17:24
将你的串口接收到的数据通过串口打印出来看看和你串口助手发过去的是不是一样的

八度大神,能不能加个qq?
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-9 22:08:06 | 显示全部楼层
起舞弄清影 发表于 2016-10-9 09:47
还是没用,我把你的串口代码拷贝到我的工程,修改串口号,晶振也改为探索板上的8M,还是不行,

那你先试一下你的串口工作对不?首先要确定你的串口工作正常,后面就没有问题了,主要是验证你的接收和发送中断对不对。
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-10 16:43:43 | 显示全部楼层
皇甫仁和 发表于 2016-10-9 22:08
那你先试一下你的串口工作对不?首先要确定你的串口工作正常,后面就没有问题了,主要是验证你的接收和发 ...

1.现在已经可以达到你的效果了,我是将偶校验改为无校验,他就成功了,但是对于原因还是没搞明白我之前串口是设置偶检验,串口助手里面也是偶校验,按理说没问题啊
现在我串口设置为无检验,串口助手里面也是无校验,结果成功了,这是为什么?如图1  
2.我如果按照楼主的数据发,即串口助手发送命令0A 04 00 01 00 01 61 71,读取usRegInputBuf[REG_INPUT_NREGS]中地址为1的数,收到70 02确实没错,如图2

但是我如果读取地址0的数,即串口助手发送命令0A 04 00 00 00 01 30 B1,读到的却是一个随机数,而不是80 01,如图3
捕获112.PNG
图2.PNG
图3.PNG
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-10 20:30:55 | 显示全部楼层
起舞弄清影 发表于 2016-10-10 16:43
1.现在已经可以达到你的效果了,我是将偶校验改为无校验,他就成功了,但是对于原因还是没搞明白我之前串 ...

第一,你需要注意你的代码中输入寄存器的起始地址:
#define REG_INPUT_START 0x0001
#define REG_INPUT_NREGS 8
第二、你需要注意FreeModbus源代码中的一个小问题
eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )这函数中的这句:
        usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 );
        usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] );
        usRegAddress++;实际协议中是将你的地址加1了,也就是你发送的地址为0,实际协议认为的地址是1,
第三、我的测试结果是:
Tx:648-0A 04 00 00 00 01 30 B1
Rx:649-0A 04 02 80 01 BC F1
是正确的。
回复 支持 反对

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2016-10-12 09:55:23 | 显示全部楼层
厉害了八度大神~八度大神好多帖子都牛b啊
回复 支持 反对

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1100
金钱
1100
注册时间
2016-7-19
在线时间
168 小时
发表于 2016-10-12 12:35:34 | 显示全部楼层
顶啊!有用
回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2016-10-14 21:31:46 | 显示全部楼层
皇甫仁和 发表于 2016-10-10 20:30
第一,你需要注意你的代码中输入寄存器的起始地址:
#define REG_INPUT_START 0x0001
#define REG_INPU ...

1.我代码中的起始地址是从0x0000开始的啊,而且这个和起始地址定义多少无关吧。
我把他改为0x0001,结果返回错误

2.我是将usRegAddress++屏蔽掉了的,但是结果就是不对
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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