【1.项目描述】

手上有一个温湿度传感器,基于modbus RTU协议,采用RS485串口和Tiny6410通信,把采集到的温湿度显示在Tiny6410的界面程序上。这里简要给出使用libmodbus第三方工具读取温湿度的程序流程。关于libmodbus在嵌入式LINUX上的使用方法,参考上一篇博客: http://blog.chinaunix.net/uid-11829250-id-5750595.html

【2.关于libmodbus】

libmodbus是一个免费开源的第三方modbus协议库,可工作在多种平台下 。libmodbus支持 RTU方式和TCP/IP方式。这里传感器使用的是modbus RTU方式。 在modbus RTU方式 中,对client/master和server/slave的是这样定义的:
The Modbus RTU framing calls a slave, a device/service which handle Modbus requests, and a master, a client which send requests. The communication is always initiated by the master.
从这个定义中可以看出,构造RTU数据帧,并且响应modbus请求的一方是server/slave,而发出请求的一方是client/master,并且双方通信总是由client/master一方发起。因此本项目中,温湿度传感器是server/slave一方,Tiny6410是client/master一方。

【3.温湿度传感器Modbus RTU协议】

查看温湿度传感器手册,采用RS485通信,采用串口参数为波特率9600,数据位8,停止位1,无校验位。若要读取温湿度数值,则Tiny6410要往温湿度传感器发送的请求帧为:01 03 00 00 00 02 c4 0b,这里都是十六进制表示。01表示温湿度传感器的从站地址;03是modbus功能码,表示读取保持寄存器的值;00 00是保持寄存器的地址;00 02是读取寄存器的长度;c4 0b是CRC校验位。正常情况下,温湿度传感器会返回给Tiny6410 TRU帧为01 03 04 01 0F 02 16 CRCHCRCL。01为从站地址;03为modbus功能码;04为读取的数据字节长度;010F为温度数据,换算成十进制后除以10,得到真实的温度值;0216为湿度数据,换算成十进制后除以10,得到真实的湿度值。

【4.libmods编写读传感器温湿度程序流程】

使用libmodbus读取传感器数值,一般要经过这样几个步骤(采用modbus RTU方式):
1.创建一个modbus_t类型的context,用来打开串口
modbus_t  *ctx;
ctx = modbus_new_rtu("/dev/ttySAC3",9600,'N',8,1);
这里打开的串口是Tiny6410的串口3,波特率9600,无校验,数据位是8,停止位是1。
2.建立连接
modbus_connect(ctx);//建立和传感器的连接
3.设置超时时间:
    struct timeval t;
    t.tv_sec = 0;
    t.tv_usec = 1000000;//1000ms
    modbus_set_response_timeout(ctx,&t);
libmodbus中对 modbus_set_response_timeout的定义如下:
The modbus_set_response_timeout() function shall set the timeout interval used to wait for a response. If the waiting before receiving the response is longer than the given timeout, an error will be raised.
意思是如果在超时时间内还没有收到响应,那么就会发出一个错误码。
4.设置slave地址
modbus_set_slave(ctx, 0x01);//温湿度传感器的modbus站地址为0x01;
5.读保持寄存器的值。
使用int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)读取保持寄存器的值。对该函数的描述是:

The modbus_read_registers() function shall read the content of the nb holding registers to the address addr of the remote device. The result of reading is stored in dest array as word values (16 bits).

You must take care to allocate enough memory to store the results in dest (at least nb * sizeof(uint16_t)).

The function uses the Modbus function code 0x03 (read holding registers).

该函数用来读保持寄存器的值,使用的功能码是0x03,其中寄存器的起始地址放入addr参数,读寄存器的个数放入nb参数,读出的值放入dest。若读取正确,返回值为读取的寄存器数,若读取错误,返回值为-1。针对本例,应使用的函数为:
uint16_t tab_reg[2];
int regs=modbus_read_registers(ctx,0,2,tab_reg);
读取温湿度的 请求帧为:01 03 00 00 00 02 c4 0b,即寄存器地址为0,要读的寄存器个数为2。若读取成功,温度数值置于tab_regp[0],湿度数值置于tab_reg[1],分别除以10,就得到正确的温湿度数值。
5.释放并关闭modbus

modbus_close(ctx); 
modbus_free(ctx);

此外,当有多个从站时,需要仔细设置  response timeout。这是摘录libmodbus v3.1.2帮助文档里的一段话
The libmodbus implementation of RTU isn’t time based as stated in original Modbus specification, instead all bytes are sent as fast as possible and a response or an indication is considered complete when all expected characters have been received. This implementation offers very fast communication but you must take care to set a response timeout of slaves less than response timeout of master (ortherwise other slaves may ignore master requests when one of the slave is not responding).
这段话的意思是说,从站设置的response timeout应小于主站的response timeout,因此为了防止出现某些从站因为response timeout设置不恰当而不能响应的问题,建议把主站的response timeout设置的尽可能大一些。

使用libmodbus读传感器流程相关推荐

  1. Tmd27711 三合一传感器流程

    Tmd27711 三合一传感器流程 云科世纪   戴楊一如 参考http://blog.sina.com.cn/s/blog_89f592f5010132qy.html 零.編譯與燒寫 编内核与and ...

  2. HDFS的读/写流程

    1.HDFS读流程 HDFS读流程 1.1 .Client通过FileSystem.open(filePath)方法,与NN节点进行[rpc]协议通信,校验是否有权限是否存在,假如都ok,返回该文件的 ...

  3. 低频RFID读卡流程

    低频RFID系统与ID卡 低频RFID系统读卡器的工作频率范围一般从120KHz到134KHz.该频段的波长大约为2500m,除了金属材料影响外,一般低频能够穿过任意材料的物品而不降低它的读取距离.低 ...

  4. (面试经典问题)HDFS下载文件(读)流程

    读流程详述 以hadoop fs -get /a.txt /root为例,三副本,文件切成了三个block,分别存放在三台DataNode上. 1.客户端发起下载文件请求. 2.NameNode收到请 ...

  5. 银联IC卡读卡流程详解--读卡器与卡交互指令

    最近因研究了下银联借记/贷记应用卡片规范,发现网上可参考资源较少,于是萌生了写下这篇文字的想法,希望可以帮助到有需要的兄弟姐妹,有描述不清晰或者有错误的地方欢迎指正. 下面进入正题,测试使用的卡是招商 ...

  6. pboc 读卡流程,apdu读卡流程

    应用选择,第一步选择一个应用,1PAY.SYS.DDF0,应用的文件名字为1PAY.SYS.DDF01,apdu命令分析,应用选择的apdu 00A404000E//04代表通过名称进行选择ic卡的应 ...

  7. Stm32旧版库函数18——读传感器

    /******************************************************************************* // // 使用单片机STM32F10 ...

  8. VB6银联读卡之旅(二)__55域获取流程及相关注意

    银行卡读卡涉及相关APDU命令发送.网上有很多相关博客进行了详细说明,这里就不在赘述.本文主要讲55域获取流程及本人联调时遇到的相关问题.在智能卡读取使用方面本人也属于初学者,其中如有疑问或表述不正确 ...

  9. 读标准01-IEEE1451-智能传感器接口标准介绍

    老规矩,这里排版不是最佳,并且下文有个别误字太麻烦去改(这里保持第一版 2021.7.14,方便的话请移步 Github/Gitee 页面看最新的,或下载下来用 markdown 编辑器看排版更佳:G ...

最新文章

  1. 使用 Python 从零开始开发区块链应用程序
  2. 牛客网平台常州大学新生寒假训练会试
  3. Matlab之Kalman:用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法
  4. 2019年1月16日【第三天学习】
  5. 英文网站源码 国外财经资讯商业新闻整站源码 全自动采集发布 广告联盟网站
  6. 虚拟局域网+思科交换机基础配置学习有图简单易懂.
  7. OpenCV4--->基础函数,与操作
  8. 前端数据加密(Base64、MD5、AES、RSA)
  9. 出价成本计算机软件,百度竞价推广中,关键词怎么出价可以降低成本?
  10. 国内智能工厂建设现状以及未来发展趋势介绍
  11. 微软:今天起加速推广Windows 11,让更多设备免费升级
  12. Oracle试卷02
  13. 【精品推荐】130个令你眼前一亮的网站,总有一个你用得着(转)
  14. 知名卸载软件Revo Uninstaller Pro挑战Deep Freeze卸载动画视频教程
  15. 开源项目-CRM客户关系管理系统
  16. 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理
  17. 聊聊redis分布式锁的8大坑
  18. amazon_亚马逊甚至不再那么方便
  19. 以色列初创企业Skyline AI获300万美元种子融资,红杉资本领投
  20. vb.net 教程 10-1 Office操作

热门文章

  1. 隐写术,图片中隐藏的秘密!
  2. 【数据结构初阶】八大排序算法+时空复杂度
  3. 停止不必要的UI动效设计
  4. 域名备案与空间备案有什么关系吗,域名备案又是怎么回事?
  5. 【Java 】\u003d乱码
  6. 论文阅读“DeepDPM: Deep Clustering With an Unknown Number of Clusters” (CVPR 2022)
  7. SaaSBase:什么是明基逐鹿?
  8. 基于DHCP和NAT的家庭网络设备间通信解决方案
  9. 三国志13pk版登录武将输入中文名方法与更改图像详解
  10. 大赞 《战狼2》破40亿 刷新华语票房纪录