树莓派c语言modbus,树莓派串口利用modbus通信

1、安装

sudo apt-get install libmodbus-dev

2、搭建modbus环境

https://blog.csdn.net/starelegant/article/details/72782946

3、编写测试程序

https://blog.csdn.net/qq_23670601/article/details/82155378#%E5%88%9D%E8%AF%95%E5%8C%96RTU%E7%8E%AF%E5%A2%83%E6%8C%87%E9%92%88%20modbus_t%20*modbus_new_rtu(const%20char%20*device%2C%20int%20baud%2C%20char%20parity%2C%20int%20data_bit%2C%20int%20stop_bit)

#include #include #include int main()

{

modbus_t *mb;

uint16_t tab_reg[32]={0};

mb=modbus_new_rtu("/dev/ttyS0",115200,'N',8,1);

if(0==modbus_rtu_get_serial_mode(mb))

{

modbus_rtu_set_serial_mode(mb,MODBUS_RTU_RS232);

printf("serial is RS232\n");

}

else {

printf("serial is RS485\n");

modbus_rtu_set_serial_mode(mb,MODBUS_RTU_RS485);

}

modbus_set_slave(mb,1);

// modbus_rtu_set_rts(mb,MODBUS_RTU_RTS_UP);

modbus_connect(mb);

int regs=modbus_read_registers(mb,0,8,tab_reg);

printf("%d %d %d %d %d\n",regs,tab_reg[0],tab_reg[1],tab_reg[2],tab_reg[3]);

modbus_close(mb);

modbus_free(mb);

return 0;

}

4、gcc modbus_rtu.c -o modbus_rtu -lmodbus

如果用了wiringPi库,还要加上-lwiringPi

5、测试

e212ca9ac279d05027c7377ebd3dd5df.png

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于stm32的uart串口modbus通讯协议源码+说明文档.zip modbus-RTU协议 **Modbus报文帧结构** 一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据 Modbus协议在串行链路上的报文格式如下所示: ![image](https://github.com/KeyL-SJ/stm32_uart_modbus/assets/78483846/bcec2fe4-3a28-42b3-b2aa-8d75f8fe1f36) | 从机地址 | 功能码 | 数据 | CRC校验 | | :------: | :----: | :-----: | :-----: | | 1 byte | 1 byte | N bytes | 2 bytes | **帧结构 = 从机地址 + 功能吗 + 数据 + 校验** - 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答) - 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能. - 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。 - 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确 # Modbus功能码 **Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。** Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示: | 功能码 | 功能说明 | | :----: | :------------: | | 01H | 读取输出线圈 | | 02H | 读取输入线圈 | | 03H | 读取保持寄存器 | | 04H | 读取输入寄存器 | | 05H | 写入单线圈 | | 06H | 写入单寄存器 | | 0FH | 写入多线圈 | | 10H | 写入多寄存器 | 当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。 # CRC校验 **错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。** 例如若主机向从机发送报文`01 03 00 00 00 01 84 0A` 其中, 最后两个字节`84 0A`就是CRC校验位,从机接收到主机发送的报文之后,根据报文的非校验位`01 03 00 00 00 01`计算CRC校验位,若从机计算出的校验位与主机发送的校验位相同,则证明数据在发送的过程中没有发生错误,反之,则代表数据传输发生错误。 ## CRC校验流程 1、预置一个16位寄存器为`0FFFFH`(全1),称之为CRC寄存器。 2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。 3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。 4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值`0A001H`进行异或运算。 5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。 6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。 7、最终CRC寄存器的值就是CRC的值。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值