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. Android Studio的优化/Gradle构建

    转自链接http://bbs.itheima.com/thread-204217-1-1.html   使用Android Studio进行开,随着项目的增大,依赖库的增多,构建速度越来越慢,现在最慢 ...

  2. String 与StringBuilder有什么区别

    C# String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与 ...

  3. 几个js函数

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. 如何设置ASP.NET页面的运行超时时间 (转载)

    全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值. Machine.config 文件位于 ...

  5. 一周试用yii开发一个带各种该有功能的web程序(二)

    上篇随笔写完的是yii能使用简单的命令创建出一个基本的架构,我们只需要在这个架构上进行代码编写,扩展功能.而生成的一个小型系统是可以操作的,但是不是我们想要的,所以,这篇结合源码讲如何创建出我们自己的 ...

  6. iOS 里面 Swift与Objective-C混编,Swift与C++混编的一些比较

        即使你尽量用Swift编写iOS程序,难免会遇到部分算法是用C++语言编写的.那你只能去问问”度娘“或“狗哥”怎么用Swift调用C++算法.   一,C,C++, Objective-C,S ...

  7. 170103、Redis官方集群方案 Redis Cluster

    前面我们谈了Redis Sharding多服务器集群技术,Redis Sharding是客户端Sharding技术,对于服务端来说,各个Redis服务器彼此是相互独立的,这对于服务端根据需要灵活部署R ...

  8. grid style

    <style type="text/css"> .g_grid tr{ border-left:none; border-right:none; border-top: ...

  9. Java项目多数据源配置

    由于种种原因,有的时候可能要连接别人的数据库,或者不同的数据库没法自动转换,重构起来数据量又太大了,我们不得不在一个项目中连接多个数据源.从网上找了各种资料,只有这位大神给出的解决方案一下子就成功了. ...

  10. 关于sql中join

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...