Modbus RTU程序开发解读

时间:2022-12-08 08:32:53

Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息。

从官网下载libModbus,观察modbus.h可知关键的结构体为:

typedef struct {
    int nb_bits;
    int nb_input_bits;
    int nb_input_registers;
    int nb_registers;
    uint8_t *tab_bits;
    uint8_t *tab_input_bits;
    uint16_t *tab_input_registers;
    uint16_t *tab_registers;
} modbus_mapping_t;

而在modbus-rtu.h中几个主要的配置函数都使用了该结构体。

RTU操作的一般步骤为:

1、用指定的串口新建一个连接,Windows系统下默认的串口为COM1,Linux系统下默认的串口是/dev/ttyS0;

2、设置频率,比特位,校验位,等价位;

3、设置超时时间;

4、读或者写操作,注意要先设置Slave:modbus_set_slave(m_modbus, 0);

5、关闭连接,取消设备绑定。

主要的操作函数有:

EXPORT int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
//读取串口数据
EXPORT int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
//读取输入端串口数据
EXPORT int modbus_write_bit(modbus_t *ctx, int coil_addr, int status);
//指定位置写操作
EXPORT int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);
//写多个端口

一个简单的例子:

int main(int argc, char * argv[])
{

modbus_t * m_modbus;
int i, addr, act;
int ret = 0;
m_modbus = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1);
//波特率9600,比特位8,校验位1,无等价位
modbus_set_debug(m_modbus, 0);
//设置为1将可以看到调试信息
struct timeval response_timeout;
response_timeout.tv_sec = 1;

response_timeout.tv_usec = 0;
modbus_set_response_timeout(m_modbus,&response_timeout);
//设置等待延时时间
if(m_modbus && modbus_connect(m_modbus) == -1) {
printf("\nSorry,fail to connect ttyS0,please check your device's state.\n");
}
else {
printf("Connected to dev!\n");
connected = 1;
}

if(m_modbus == NULL) 
{
printf("No connection,check your device!\n");
return;
}
/* //注释中的代码作用是读取串口的4个端口数据
uint8_t dest[4]; //setup memory for data
uint16_t * dest16 = (uint16_t *) dest;
memset(dest, 0, 4);
*/
modbus_set_slave(m_modbus, 0);
/* //本段注释代码给指定端口赋值
ret = modbus_read_bits(m_modbus, 0, 4, dest);
printf("%d\n", ret);
for(i = 0; i < 4 ; i++)
{
printf("\n%d:%4d",i,dest[i]);
}
for(i = 0; i < 4 ; i++)
{
ret = modbus_write_bit(m_modbus, i , 1);
if(ret)
{
printf("成功写入数据!返回值:%d\n",ret);
}
else
{
printf("写入数据失败,返回值:%d",ret);
}
sleep(2);
}
*/

//断开连接
if(m_modbus) {
modbus_close(m_modbus);
modbus_free(m_modbus);
m_modbus = NULL;
}
printf("Disconnect succeed!\n");
return 0;
}

//转自:http://www.tuicool.com/articles/YZ7NV3F

Modbus RTU程序开发解读的更多相关文章

  1. Modbus库开发笔记之六:Modbus RTU Master开发

    这一节我们来封装最后一种应用(Modbus RTU Master应用),RTU主站的开发与TCP客户端的开发是一致的.同样的我们也不是做具体的应用,而是实现RTU主站的基本功能.我们将RTU主站的功能 ...

  2. Modbus库开发笔记之五:Modbus RTU Slave开发

    Modbus在串行链路上分为Slave和Master,这一节我们就来开发Slave.对于Modbus RTU从站来说,需要实现的功能其实与Modbus TCP的服务器端是一样的.其操作过程也是一样的. ...

  3. C&num; 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 &comma; 虚拟MODBUS-RTU测试

    前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus RTU的客户端,方便的对Modbus rtu的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...

  4. 泓格WINPAC主机与第三方模块rs 485 modbus rtu通信测试

    开发语言:C# 开发环境:VS2008(支持WINCE开发的最后一个版本) 运行环境:Windows CE 5.0~7.0 项目说明:多台涨格winpac系列的主机,原来使用泓格SDK开发的程序,采集 ...

  5. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  6. 转】Mahout分步式程序开发 聚类Kmeans

    原博文出自于: http://blog.fens.me/hadoop-mahout-kmeans/ 感谢! Mahout分步式程序开发 聚类Kmeans Hadoop家族系列文章,主要介绍Hadoop ...

  7. 转】Mahout分步式程序开发 基于物品的协同过滤ItemCF

    原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...

  8. Mahout分步式程序开发 聚类Kmeans(转)

    Posted: Oct 14, 2013 Tags: clusterHadoopkmeansMahoutR聚类 Comments: 13 Comments Mahout分步式程序开发 聚类Kmeans ...

  9. 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧

    串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...

随机推荐

  1. python之浅拷贝和深拷贝

    1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...

  2. C&num;读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

  3. 利用颜色生成UIImage

    //  颜色转换为背景图片 + (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1. ...

  4. 在Eclipse中安装SVN客户端插件

    在Eclipse中安装SVN客户端插件 1.1  Eclipse插件应用市场 在Eclipse中访问Eclipse Marketplace Client可以搜索Subversion,下载插件,按提示安 ...

  5. JavaScript几种类工厂实现原理剖析

    PS:本文参考了司徒正美的<JavaScript框架设计>,以及许多其它的书籍和网络文章,感谢作者们分享了这么好的学习资源!关于JS的类和继承的原理,见:JavaScript里的类和继承文 ...

  6. hdoj 1233 还是畅通工程&lpar;最小生成树&rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路分析:该问题为最小生成树问题,使用kruskal算法或者prim算法即可解决: 代码如下: ...

  7. dedecms的include文件夹是干什么的?

    include是DEDECMS的系统文件夹,里面放的是DEDECMS系统下的一些系统功能函数文件和功能定义与说明以及参数的文件. include目录文件作用解析 arc.archives.class ...

  8. 2018面向对象程序设计(Java)第10周学习指导及要求

    2018面向对象程序设计(Java)第10周学习指导及要求(2018.11.1-2018.11.4)  学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接口的定 ...

  9. 【神经网络】LSTM 网络

      Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息.LSTM 由Hochreiter & Schmidhuber (199 ...

  10. adc 测量子系统

    #include <stdio.h>        #include <stdlib.h>         #include <fcntl.h>         # ...