写在前面

帮助朋友调试 MODBUS 通信设备,MODBUS 协议栈以前写过,但是这次也不想自己从头写一个 MODBUS 协议栈,太烦了。所以在 GitHub 上找到了 libModbus。

libModubs

官网地址为 https://www.libmodbus.org/。提供一个标准 C 实现的 Modbus 协议栈。支持 TCP 和 RTU。
该协议栈支持 Linux, Mac OS X, Win32 等系统。

工作环境搭建

设备状态

机器:Mac Book Pro。
GCC版本:4.2.1。机器显示如下:

% gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.2)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

libModbus 版本:使用最新的 3.1.6。
MODBUS设备:两个485接口的温湿度传感器,一个地址为 0x02,一个地址为 0x03。

MBP USB 转串口

我使用了一个 USB 转 485,内部芯片为 CH341。该芯片提供 Mac 的驱动。对应的下载地址为:http://www.wch.cn/download/CH341SER_MAC_ZIP.html。
下载后,安装对应驱动。插入 USB 转 485 设备。

% ls /dev/tty.
tty.Bluetooth-Incoming-Port%  tty.usbserial-1410%

如上所示,tty.usbserial-1410 就是我机器上的串口。

串口调试助手

在苹果商店搜索“串口调试助手”,下载安装即可。

上图就是在 MBP 上运行和设备通信的情况。

编译 libModbus

支持库

需要安装 autoconf、automake、libtool。可以使用命令行:
brew install autoconf automake libtool
进行安装。

编译 libModbus

解压文件,进入到对应的目录。使用命令行
./configure && make install
一般情况下,不会出现任何错误。
这样对应的库文件会安装在 /usr/local/lib 下。

% ls /usr/local/lib/libmo
libmodbus.5.dylib*        libmodbus.la*             libmongoose.2.dylib@      libmongoose.dylib@
libmodbus.dylib@          libmongoose.2.0.4.dylib@  libmongoose.a@            libmongoose_dbg.a@

如上所示,这样 libModbus 就编译好了。
头文件将安装在 /usr/local/include/modbus 目录下。

% ls /usr/local/include/modbus/
modbus-rtu.h        modbus-tcp.h        modbus-version.h    modbus.h

通信测试

本次设备为温湿度传感器。

获取温度

发送:02 04 00 01 00 01 60 39。
其中 02 表示设备地址,04 表示 Modbus 功能码,00 01 表示寄存器地址为 1,00 01 表示数据长度为 1,60 39 是 CRC 校验。
将获得:02 04 02 01 2B BC BF
其中 02 表示设备地址,04 表示 Modbus 功能码,02 表示数据长度,01 2B 表示数据内容,BC BF 是 CRC 校验。
0x012B 对应的 10 进制数据为 299,也就是说温度为 29.9 摄氏度。

获取湿度

发送:02 04 00 02 00 01 90 39。
将获得:02 04 02 01 D5 3D 3F。
对应的湿度是 0x01D5,转换成十进制为 469,对应的湿度为 46.9%。

测试代码

测试代码如下,使用标准 C,代码中都有注释。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <modbus.h>int main(int argc, char *argv[]) {modbus_t *ctx;int rc;uint16_t tab_reg[64];//打开ctx = modbus_new_rtu("/dev/tty.usbserial-1410", 9600, 'N', 8, 1);if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n",modbus_strerror(errno));modbus_free(ctx);}//打开调试模式modbus_set_debug(ctx, 1);modbus_set_response_timeout(ctx, 1, 0);//设置响应时间//设置从机地址modbus_set_slave(ctx, 2);/* 从 1 寄存器读取 1 个地址,这样获得温度*/rc = modbus_read_input_registers(ctx, 1, 1, tab_reg);if (rc == -1) {fprintf(stderr, "%s\n", modbus_strerror(errno));return -1;}//输出结果for (int i=0; i < rc; i++) {printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);}usleep(20000);/* 从 2 寄存器读取 1 个地址,这样获得湿度*/rc = modbus_read_input_registers(ctx, 2, 1, tab_reg);if (rc == -1) {fprintf(stderr, "%s\n", modbus_strerror(errno));return -1;}//输出结果for (int i=0; i < rc; i++) {printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);}usleep(20000);//设置从机地址modbus_set_slave(ctx, 3);/* 从 1 寄存器读取 1 个地址,这样获得温度*/rc = modbus_read_input_registers(ctx, 1, 1, tab_reg);if (rc == -1) {fprintf(stderr, "%s\n", modbus_strerror(errno));return -1;}//输出结果for (int i=0; i < rc; i++) {printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);}usleep(20000);/* 从 2 寄存器读取 1 个地址,这样获得湿度*/rc = modbus_read_input_registers(ctx, 2, 1, tab_reg);if (rc == -1) {fprintf(stderr, "%s\n", modbus_strerror(errno));return -1;}//输出结果for (int i=0; i < rc; i++) {printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);}usleep(20000);//关闭设备modbus_close(ctx);modbus_free(ctx);return 0;
}

编译

% gcc mytest.c -o mytest `pkg-config --libs --cflags libmodbus`

这样将得到可执行文件 mytest。

运行

% ./mytest
[02][04][00][01][00][01][60][39]
Waiting for a confirmation...
<02><04><02><01><3A><7C><B3>
reg[0]=314 (0x13A)
[02][04][00][02][00][01][90][39]
Waiting for a confirmation...
<02><04><02><01><B9><3D><12>
reg[0]=441 (0x1B9)
[03][04][00][01][00][01][61][E8]
Waiting for a confirmation...
<03><04><02><01><34><C0><B7>
reg[0]=308 (0x134)
[03][04][00][02][00][01][91][E8]
Waiting for a confirmation...
<03><04><02><01><C3><81><31>
reg[0]=451 (0x1C3)

可以看到获得的数据和上面解析的数据一致。说明已经可以使用 libModbus 进行 Modbus RTU 通信。

下一步工作

测试代码已经完成,下面开始写正式的工程代码。

MAC Book Pro 使用 libmodbus相关推荐

  1. 71 mac boook pro 无 gpu 下caffe 安装

    71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...

  2. Mac Book Pro不能识别移动硬盘

    2019独角兽企业重金招聘Python工程师标准>>> 今天把一台Mac Book Pro重装了一下系统,然后想把移动硬盘上的资料考入电脑,发现插上移动硬盘电脑没有反映.马上搜索解决 ...

  3. mac php7.0 yaf 安装,MAC MAMP PRO PHP YAF 安装

    MAC MAMP PRO PHP YAF 安装 下载对应版本的php源码 比如php-5.4.39 下载下来后放到MAMP对应的PHP目录 /Applications/MAMP/bin/php/php ...

  4. mac book pro高清录屏教程(obs录屏+麦克风录制+soundflower电脑声录制)三合一

    mac book pro高清录屏教程(obs录屏+麦克风录制+soundflower电脑声录制)三合一 soundflower安装 2.找到软件 音频MIDI设置打开进行添加聚集设备和多输出设备 3. ...

  5. 如何将 M1 Mac(MacBook Pro、Air、iMac、Mac mini)恢复出厂设置?

    在继续执行下面提到的步骤之前,请确保备份 Mac以及所有要保留的重要文件和数据,因为它们将在出厂恢复期间永久删除.如果没有备份,您将无法取回这些文件.一切完成后,您将只拥有 Mac 随附的操作系统的库 ...

  6. mac book pro 安装网络准入后经常死机

    Others mac book pro 安装网络准入后经常死机 描述: 公司要求安装网络准入软件,安装联软科技的网络准入客户端. mac book pro 安装网络准入后经常死机 本人程序员,做大数据 ...

  7. 解决Mac book pro (M1芯片)电脑打开idea卡顿,cpu飙升的问题。

    解决Mac book pro (M1芯片)电脑打开idea卡顿,cpu飙升的问题! 之前使用电脑打开软件都没啥问题,最近频繁发现电脑打开某些软件,比如:微信,钉钉等,打开就会时不时的鼠标转圈,体验极差 ...

  8. node-sass安装失败 error D:\xxx\xxx\node_modules\node-sass: Command failed.(window + mac M1 pro)

    error D:\xxx\xxx\node_modules\node-sass: Command failed. 导言:运行老项目的时候经常遇到node-sass安装不下来的问题,百度搜索更是千篇一律 ...

  9. mac book pro m1 java开发环境,工具汇总,idea,jdk,navicat,java,maven,mysql,rdm,redis下载安装

    1月5日更新:用m1开发快两周了,最大的感受就是确实快. 软件适配方面,我之前担心适配问题,现在没有顾虑了,常用的软件都有适配,没有适配的也可以用以前现有的软件,并不是完全不能用. 12-29已经收到 ...

最新文章

  1. 为什么电脑磁盘从C盘开始,之前的A盘和B盘呢?
  2. GD32F130命名方式
  3. 利用Gearman,搭建异步分布式计算平台
  4. 开了gomod不识别gopath_三分钟掌握Go mod常用与高级操作
  5. yoyo思维题(困难) 组合数学
  6. dataframe数据标准化处理_数据预处理——标准化/归一化(实例)
  7. java 当前类_Java获取当前类名的两种方法
  8. Redis笔记之基本数据结构 动态字符串SDS
  9. linux内核那些事之ZONE
  10. 前向算法(Forward Algorithm)
  11. sqlserver 获取当前操作的数据库名称
  12. 拇指接龙游戏中的Undo道具与STL容器deque简介
  13. 系统集成项目管理工程师和信息系统项目管理师的区别
  14. 震惊!!【微信拼图红包】继微信语音红包后又一新技能
  15. iphone机型分辨率
  16. event mpm php,Apache下三种MPM模式:prefork,worker和event
  17. 超人再起 Superman Returns
  18. angularjs的三目运算
  19. PTA---计算天数
  20. Recovering Realistic Texture in Image Super-resolution by Deep Spatial Feature Transform

热门文章

  1. 算数操作符与移位操作符
  2. 文心一言眼里的Java世界
  3. cdr 表格自动填充文字_长期伏案于表格,查看数据时你需要一个聚光灯效果
  4. 小程序微商城-商铺管理后台
  5. 苏嵌//张福辉//2018.7.13
  6. 阿里云服务器搭建视频
  7. java添加窗体中_java中利用JFrame创建窗体 【转】
  8. SkyWalking Agent数据采集和上报原理浅析
  9. Android去除烦人的默认闪退
  10. EXCEL中发现不可读的内容。是否恢复此工作薄的内容?如果信任此工作薄的来源,请单击”是“