MAC Book Pro 使用 libmodbus

本文介绍了如何在MacBook Pro环境中安装和使用libModbus库,实现与MODBUS协议的485串口温湿度传感器通信,包括设备连接、库安装、测试代码和通信结果验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

帮助朋友调试 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 通信。

下一步工作

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

<think>好的,我现在要帮用户了解MacBook Pro 2015的硬盘升级方案。首先,我需要确认用户的需求是什么。他们可能希望提升存储容量或速度,或者两者兼有。MacBook Pro 2015的硬盘是SSD,但具体型号和接口需要查证。 接下来,我得回忆一下这款机型的硬盘接口类型。记得2015年的MacBook Pro使用的是PCIe接口,但具体的版本和插槽可能有差异。比如,是否支持NVMe协议?早期的Mac系统可能需要特定的SSD型号才能兼容。 然后,考虑可用的升级选项。原厂SSD的容量可能有限,用户可能想换成更大的第三方SSD。但需要注意兼容性问题,比如物理尺寸、接口协议以及系统识别的问题。可能需要转接卡,比如M.2 NVMe SSD加适配器。 还要考虑系统安装的问题。升级硬盘后可能需要重新安装macOS,或者从旧硬盘迁移数据。用户可能需要使用恢复模式或者Time Machine备份。 另外,性能提升方面,NVMe SSD相比原厂的可能更快,但实际速度是否受限于PCIe通道的数量?比如,2015款可能只支持PCIe 2.0或3.0,这会影响最大传输速度。 还要提醒用户备份数据,避免升级过程中数据丢失。同时,可能需要工具如螺丝刀等来拆机,需要注意静电防护和操作安全。 可能存在的风险包括兼容性问题导致无法启动,或者系统不识别新硬盘。这时候需要检查固件版本,或者是否有必要更新系统到最新版本。 最后,总结几种可行的方案,比如使用特定品牌的SSD加转接卡,或者购买原厂拆机件。列出步骤和注意事项,帮助用户顺利完成升级。</think>以下是MacBook Pro 2015(13寸/15寸)硬盘升级的详细方案,分步骤说明: --- ### 一、原厂硬盘特性 - **接口类型**:PCIe 2.0 ×4(理论速度约1.6GB/s) - **硬盘形态**:Apple定制AHCI协议SSD(非通用NVMe) - **原厂容量**:128GB/256GB/512GB/1TB(可升级上限为2TB) --- ### 二、升级方案对比 #### 方案1:原厂拆机SSD(兼容性最佳) - **适用型号**:苹果2013-2015款专用SSD(如`A1398`/`A1502`) - **优点**:即插即用,无需转接卡,支持休眠/启动 - **缺点**:价格高(二手1TB约800元),速度上限1.5GB/s - **推荐品牌**:OWC、原厂拆机盘 #### 方案2:NVMe SSD + 转接卡(性价比高) - **硬件需求**: - **SSD型号**:M.2 NVMe SSD(如西数SN570/三星970 EVO Plus) - **转接卡**:Sintech NGFF M.2转苹果PCIe(型号`ST-NGFF2013-C`) - **优点**:成本低(1TB约500元+转接卡30元),速度提升至2.0GB/s - **缺点**: - 需macOS 10.13 High Sierra及以上系统 - 休眠耗电增加(需关闭`hibernatemode`) - 早期系统需打补丁(如`NVMeFix.kext`) --- ### 三、操作步骤(以方案2为例) #### 步骤1:备份数据 - 使用Time Machine或外置硬盘备份系统 #### 步骤2:拆机更换硬盘 1. 关机后使用**P5五角螺丝刀**拆卸底盖 2. 断开电池排线(避免短路) 3. 移除原厂SSD固定螺丝(T5螺丝刀) 4. 插入转接卡+NVMe SSD(注意45°斜插) #### 步骤3:系统安装 1. 开机按住`Command+Option+R`进入恢复模式 2. 通过磁盘工具格式化新SSD为`APFS/GUID分区` 3. 联网安装macOS或从备份恢复 #### 步骤4:优化设置(针对NVMe) - 关闭深度休眠(终端执行): ```bash sudo pmset -a hibernatemode 0 sudo rm /var/vm/sleepimage ``` - 禁用APST节能(可选): ```bash sudo nvram boot-args="nvme_apst=0" ``` --- ### 四、注意事项 1. **兼容性风险**:部分NVMe SSD(如三星980 Pro)可能不兼容 2. **温度监控**:安装`TG Pro`监控SSD温度(NVMe发热较高) 3. **速度实测**: - 原厂SSD:读1400MB/s,写1200MB/s - NVMe SSD:读1600MB/s,写1500MB/s(受PCIe 2.0带宽限制) --- ### 五、扩展建议 - **双硬盘方案**:保留原厂SSD+光驱位转接SATA SSD(需拆光驱) - **内存限制**:2015款内存为板载不可升级(建议优先升级硬盘) 通过以上方案,可显著提升存储性能与容量,成本可控且操作风险较低。建议优先选择三星970 EVO Plus等低功耗NVMe SSD。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值