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# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟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. jQuery 获取当前节点的html包含当前节点的方法

    在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到. 看到有的人通过pare ...

  2. WebIM 聊天 Demo

    最近 2 个月用业余时间写了一个 IM ,动手之前想了很多,包括前期设计.语言.数据库等,经过了一番思想斗争,最终前台用 Vue.js 展示,Server 使用 node ,数据库使用 MongoDB ...

  3. [原创]Visual Studio 使用 Just My Code引起无法断点

    今天遇到的问题,同样的代码,在一台机器上用Release配置可以命中断点,在另一台上用Release断点就都失效了.后来发现是因为断点失效的机器上设置了Just My Code.在Debug-Opti ...

  4. spring MVC和hibernate的结合

    我们在没有用注解写spring配置文件的时候:会在spring配置文件中定义Dao层的bean,这样我们在service层中,写setDao方法,就可以直接通过接口调用Dao层.            ...

  5. 定位和xml解析和gson解析加上拉加载,下拉刷新

    这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...

  6. python学习笔记之类class(第六天)

         参考文档:              1.金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html               ...

  7. 51单片机tea5767收音机 红外遥控 自动搜台 存台 DIY

    先看效果图: 显示 频道CH , 频率 100.0Mhz 欢迎信息,1602 内置日文平假名, 正好用来显示博主名称. 焊接前,已经万能面包板上试验成功. 焊接完成以后,1602 的D0 - D7 接 ...

  8. wex5 实战 登陆帐号更换与用户id一致性

    一 前言 关于用户登陆,注册,页面跳转,我讲了很多,都是页面框架级别的.有人问到这个问题,索性总结一下,今天是收尾最后一篇. 以往初学时的设计是: 1 注册 2 登陆 3 进入页面. 这种很简单,没有 ...

  9. java中的队列

    转载自:http://blog.csdn.net/guijava/article/details/3784658 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.Qu ...

  10. Java经典兔子问题

    题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思指的是每个月的兔子总对数:假设将兔子分为小 ...