OpenEdv-开源电子网

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

新人求助485一主多从通信!

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-7-10
在线时间
3 小时
发表于 2019-7-16 09:44:15 | 显示全部楼层 |阅读模式
基于MODUBUS RTU协议的485通信,要求实现一主多从通信,有没有大神可以分享一下源码的!最好有注释!万分感谢!!!

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

使用道具 举报

8

主题

28

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-11-6
在线时间
21 小时
发表于 2019-7-16 15:22:10 | 显示全部楼层
真希望原子哥能出个modbus
回复 支持 1 反对 0

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-7-16 12:19:50 | 显示全部楼层
帮顶~~
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-7-16 15:17:12 | 显示全部楼层
楼主外包吧 啥样的需求都可以提
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-11-6
在线时间
21 小时
发表于 2019-7-16 15:20:32 | 显示全部楼层
我最近也在搞这个,我在找232的程序,我这有一个485的你看行不行,人家的程序

modbus通讯测试.zip

89.89 KB, 下载次数: 111

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-7-10
在线时间
3 小时
 楼主| 发表于 2019-7-16 16:34:27 | 显示全部楼层
Beyonder 发表于 2019-7-16 15:20
我最近也在搞这个,我在找232的程序,我这有一个485的你看行不行,人家的程序

感谢!!先看看~
回复 支持 反对

使用道具 举报

13

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3225
金钱
3225
注册时间
2016-5-7
在线时间
531 小时
发表于 2019-7-17 23:36:22 来自手机 | 显示全部楼层
你可以去安富莱论坛找一找rs485和modbus都有例子
回复 支持 反对

使用道具 举报

13

主题

271

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5387
金钱
5387
注册时间
2017-8-14
在线时间
248 小时
发表于 2019-7-28 22:13:50 | 显示全部楼层
本帖最后由 zml13917492379 于 2019-9-2 10:02 编辑

是不是 要 这个 网络 结构的   源程序


CANWeb_STM32F10xKeil开发板及源程序说明190520.zip (2.69 MB, 下载次数: 17)
详细资料扣扣群204408503自行下载
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-5-20
在线时间
32 小时
发表于 2019-7-29 22:55:37 | 显示全部楼层
485设备都是并联挂在485总线上,主机发指令相当就是广播,所有的设备都会收到数据,但每个485设备都是有不同通讯地址,每个设备都是会将收到的数据包校验,然后再判断数据包地址是否是本机地址,如果地址一致则解析数据。
void TaskModbusRecvMsg(void)
{
        u16 crc = 0;
       
        //m_uMsgTimeCount++;
        //if (m_uMsgTimeCount >= 10)
        //{
        //        m_uMsgTimeCount = 0;
               
                if (m_uRecvCount >= 8)
                {
                        //检测设备地址是否正确--0xff为广播地址
                        if ((szRecvMsgBuffer[0] == 0xff) || (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR]))
                        //if (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR])
                        {
                                //crc = (szRecvMsgBuffer[m_uRecvCount-2] << 8) | szRecvMsgBuffer[m_uRecvCount-1];
                                crc = (szRecvMsgBuffer[m_uRecvCount-1] << 8) | szRecvMsgBuffer[m_uRecvCount-2];
                               
                                if (crc == crc16(szRecvMsgBuffer, m_uRecvCount-2))
                                {
                                        msg.function = szRecvMsgBuffer[1];
                                        msg.regAddr = szRecvMsgBuffer[2];
                                        msg.regAddr = (msg.regAddr << 8) | szRecvMsgBuffer[3];
                                        msg.regCount = szRecvMsgBuffer[4];
                                        msg.regCount = (msg.regCount << 8) | szRecvMsgBuffer[5];
                                       
                                        msg.error = MB_EX_NONE;
                                        if (MB_FUNC_WRITE_MULTIPLE_REGISTERS == msg.function)
                                        {
                                                msg.len = (szRecvMsgBuffer[6] > MBRTU_MSG_REQ_BUF_SIZE) ? MBRTU_MSG_REQ_BUF_SIZE : szRecvMsgBuffer[6];
                                                memcpy(msg.dat, &szRecvMsgBuffer[7], msg.len);
                                        }

                                        ModbusMsgRecvEvent(&msg);
                                }
                                else
                                {
                                        msg.function = 0x80+szRecvMsgBuffer[1];
                                        msg.error = MB_EX_MEMORY_PARITY_ERROR;//数据校验错误
                                        mbrtu_respond(&msg);
                                }

                        }
                        /*else
                        {
                                msg.function = 0x80+szRecvMsgBuffer[1];
                                msg.error = MB_EX_SLAVE_DEVICE_FAILURE;//设备地址错误
                                mbrtu_respond(&msg);
                        }*/


                        m_uRecvCount = 0;
                        ModbusClear = 0;
                }
                else
                {
                        ModbusClear++;
                        if(ModbusClear>=3)
                        {
                                ModbusClear=0;
                                m_uRecvCount = 0;
                        }
                }
        //}
}
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-5-20
在线时间
32 小时
发表于 2019-7-29 22:57:04 | 显示全部楼层
//485通讯,每个设备都有自己地址,而且485总线上的设备地址不能一样,以免冲突。
void TaskModbusRecvMsg(void)
{
        u16 crc = 0;
       
        //m_uMsgTimeCount++;
        //if (m_uMsgTimeCount >= 10)
        //{
        //        m_uMsgTimeCount = 0;
               
                if (m_uRecvCount >= 8)
                {
                        //检测设备地址是否正确--0xff为广播地址
                        if ((szRecvMsgBuffer[0] == 0xff) || (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR]))
                        //if (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR])
                        {
                                //crc = (szRecvMsgBuffer[m_uRecvCount-2] << 8) | szRecvMsgBuffer[m_uRecvCount-1];
                                crc = (szRecvMsgBuffer[m_uRecvCount-1] << 8) | szRecvMsgBuffer[m_uRecvCount-2];
                               
                                if (crc == crc16(szRecvMsgBuffer, m_uRecvCount-2))
                                {
                                        msg.function = szRecvMsgBuffer[1];
                                        msg.regAddr = szRecvMsgBuffer[2];
                                        msg.regAddr = (msg.regAddr << 8) | szRecvMsgBuffer[3];
                                        msg.regCount = szRecvMsgBuffer[4];
                                        msg.regCount = (msg.regCount << 8) | szRecvMsgBuffer[5];
                                       
                                        msg.error = MB_EX_NONE;
                                        if (MB_FUNC_WRITE_MULTIPLE_REGISTERS == msg.function)
                                        {
                                                msg.len = (szRecvMsgBuffer[6] > MBRTU_MSG_REQ_BUF_SIZE) ? MBRTU_MSG_REQ_BUF_SIZE : szRecvMsgBuffer[6];
                                                memcpy(msg.dat, &szRecvMsgBuffer[7], msg.len);
                                        }

                                        ModbusMsgRecvEvent(&msg);
                                }
                                else
                                {
                                        msg.function = 0x80+szRecvMsgBuffer[1];
                                        msg.error = MB_EX_MEMORY_PARITY_ERROR;//数据校验错误
                                        mbrtu_respond(&msg);
                                }

                        }
                        /*else
                        {
                                msg.function = 0x80+szRecvMsgBuffer[1];
                                msg.error = MB_EX_SLAVE_DEVICE_FAILURE;//设备地址错误
                                mbrtu_respond(&msg);
                        }*/


                        m_uRecvCount = 0;
                        ModbusClear = 0;
                }
                else
                {
                        ModbusClear++;
                        if(ModbusClear>=3)
                        {
                                ModbusClear=0;
                                m_uRecvCount = 0;
                        }
                }
        //}
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-9 11:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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