"# libmodbus - \u9002\u7528\u4e8e Linux,Mac OS,FreeBSD,Windows \u7684 Modbus \u5e93\n\n> 2022-03-18 | 2023-10-29\n> https:\/\/www.modbus.cn\/en\/6783.html\n\n**Modbus\u7f16\u7a0b\u5f00\u53d1**\n\n---\n\n## \u6982\u8ff0\n\nlibmodbus\u662f\u4e00\u4e2a\u5feb\u901f\u4e14\u53ef\u79fb\u690d\u7684Modbus\u5e93\uff0c\u652f\u6301\u4f20\u7edf\u7684RS-232\u3001RS-422\u3001RS-485\u548c\u4ee5\u592a\u7f51\u8bbe\u5907\u3002\n\n## \u5b89\u88c5\n\n**Linux\u3001MacOS\u3001FreeBSD\u3001WIN32\u7b49\u53ef\u76f4\u63a5\u901a\u8fc7\u5305\u7ba1\u7406\u5668\u5b89\u88c5 `libmodbus`**\n\nlibmodbus\u5b98\u7f51\u4e0b\u8f7d\uff1a[https:\/\/libmodbus.org\/releases\/libmodbus-3.1.7.tar.gz](https:\/\/links.jianshu.com\/go?to=https%3A%2F%2Flibmodbus.org%2Freleases%2Flibmodbus-3.1.6.tar.gz)\ngithub\u4e0b\u8f7d\uff1a[https:\/\/github.com\/stephane\/libmodbus.git](https:\/\/github.com\/stephane\/libmodbus.git)\n\n```\n\/\/\u8fdb\u5165\u89e3\u538b\u76ee\u5f55\ncd libmodbus-3.1.7\n\/\/\u914d\u7f6e\u7f16\u8bd1\u9009\u9879\uff08\u4ee5ARM\u4e3a\u4f8b\uff0c--build\u4e3a\u7cfb\u7edf\u6784\u67b6 --host\u4e3a\u7f16\u8bd1\u5bf9\u5e94\u7cfb\u7edf\u5de5\u5177\u94fe\uff0c--prefix\u4e3a\u8f93\u51fa\u76ee\u5f55\uff0c\u9009\u9879\u5747\u662f\u53ef\u9009\u7684\uff09\n.\/configure --build=i686 --host=arm-linux --enable-static --prefix=&#91;install path]\/\n\/\/\u7f16\u8bd1\u5b89\u88c5\nmake &amp;&amp; make install\n```\n\n## \u793a\u4f8b\n\n**RTU master**\n\n```\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;memory.h&gt;\n#include \"modbus.h\"\n\nint main(void)\n{ \n    int i = 0;\n    int regs = 0;\n    modbus_t *ctx = NULL;\n    uint16_t tab_reg&#91;64] = {0};\n\n    \/\/\u6253\u5f00\u7aef\u53e3: \u7aef\u53e3\uff0c\u6ce2\u7279\u7387\uff0c\u6821\u9a8c\u4f4d\uff0c\u6570\u636e\u4f4d\uff0c\u505c\u6b62\u4f4d\n    ctx = modbus_new_rtu(\"\/dev\/ttyUSB0\", 9600, 'N', 8, 1);\n    \/\/\u8bbe\u7f6e\u4ece\u673a\u5730\u5740\n    modbus_set_slave(ctx, 1);\n    \/\/\u8bbe\u7f6e\u4e32\u53e3\u6a21\u5f0f(\u53ef\u9009)\n    modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);\n    \/\/\u8bbe\u7f6eRTS(\u53ef\u9009)\n    modbus_rtu_set_rts(ctx, MODBUS_RTU_RTS_UP);\n    \/\/\u5efa\u7acb\u8fde\u63a5\n    if (modbus_connect(ctx) == -1) {\n        fprintf(stderr, \"Connexion failed: %s\\n\", modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n    \/\/\u8bbe\u7f6e\u5e94\u7b54\u5ef6\u65f6(\u53ef\u9009)\n    modbus_set_response_timeout(ctx, 0, 1000000);\n\n    while (1)\n    {\n        memset(tab_reg, 0, sizeof(tab_reg));\n        \/\/\u8bfb\u5bc4\u5b58\u5668\u8bbe\u7f6e\uff1a\u5bc4\u5b58\u5668\u5730\u5740\u3001\u6570\u91cf\u3001\u6570\u636e\u7f13\u51b2\n        regs = modbus_read_registers(ctx, 0, 20, tab_reg);\n        if (rc == -1) {\n           fprintf(stderr, \"%s\\n\", modbus_strerror(errno));\n           continue;\n        }\n        printf(\"&#91;%4d]&#91;read num = %d]\", num++, regs);\n        for (i = 0; i &lt; 20; ++i)\n        {\n            printf(\"&lt;%#x&gt;\", tab_reg&#91;i]);\n        }\n        printf(\"\\n\");\n        sleep(1);\n    }\n}\n```\n\n- **RTU-Master\u6d41\u7a0b\u603b\u7ed3\uff1a**\n\n- \u521d\u59cb\u5316 modbus \u6307\u9488\n\n- \u8bbe\u7f6e\u4ece\u7ad9ID\n\n- \u5efa\u7acb\u8fde\u63a5\n\n- \u8bfb\u53d6\u4fdd\u6301\u5bc4\u5b58\u5668\/\u8f93\u5165\u5bc4\u5b58\u5668\/\u79bb\u6563\u8f93\u5165\/\u7ebf\u5708\u8f93\u5165\n\n- \u5199\u5355\u4e2a\u5bc4\u5b58\u5668\/\u591a\u4e2a\u5bc4\u5b58\u5668\/\u591a\u4f4d\u6570\u636e\n\n- \u5173\u95ed\u8fde\u63a5\n\n**RTU slave**\n\n```\n#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;error.h&gt;\n#include &lt;memory.h&gt;\n#include \"modbus.h\"\n\nint main(void)\n{ \n    int i = 0;\n    int rc = 0;\n    modbus_t *ctx = NULL;\n    modbus_mapping_t *mb_mapping = NULL;\n    uint8_t query&#91;MODBUS_TCP_MAX_ADU_LENGTH];\n\n    \/\/\u6253\u5f00\u7aef\u53e3: \u7aef\u53e3\uff0c\u6ce2\u7279\u7387\uff0c\u6821\u9a8c\u4f4d\uff0c\u6570\u636e\u4f4d\uff0c\u505c\u6b62\u4f4d\n    ctx = modbus_new_rtu(\"\/dev\/ttyUSB0\", 9600, 'N', 8, 1);\n    \/\/\u8bbe\u7f6e\u4ece\u673a\u5730\u5740\n    modbus_set_slave(ctx, 1);\n    \/\/\u8bbe\u7f6e\u4e32\u53e3\u6a21\u5f0f\n    \/\/modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);\n    \/\/\u8bbe\u7f6eRTS\n    \/\/modbus_rtu_set_rts(ctx, MODBUS_RTU_RTS_UP);\n    \/\/\u5efa\u7acb\u8fde\u63a5\n    if (modbus_connect(ctx) == -1) {\n        fprintf(stderr, \"Connexion failed: %s\\n\", modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,\n                                    MODBUS_MAX_READ_REGISTERS, 0);\n    if (mb_mapping == NULL) {\n        fprintf(stderr, \"Failed to allocate the mapping: %s\\n\",\n                modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n\n   \/\/\u521d\u59cb\u5316\u51e0\u4e2a\u5bc4\u5b58\u5668\n   mb_mapping-&gt;tab_registers&#91;0] = 1;\n   mb_mapping-&gt;tab_registers&#91;1] = 2;\n   mb_mapping-&gt;tab_registers&#91;2] = 3;\n   mb_mapping-&gt;tab_registers&#91;3] = 4;\n   mb_mapping-&gt;tab_registers&#91;4] = 5;\n   mb_mapping-&gt;tab_registers&#91;5] = 6;\n\n    while (1)\n    {\n        memset(query, 0, sizeof(query));\n        rc = modbus_receive(ctx, query);\n        if (rc &gt; 0) {\n            modbus_reply(ctx, query, rc, mb_mapping);\n        } else if (rc  == -1) {\n            \/\/Connection closed by the client or error\n            break;\n        }\n    }\n\n    printf(\"Quit the loop: %s\\n\", modbus_strerror(errno));\n\n    modbus_mapping_free(mb_mapping);\n    if (s != -1) {\n        close(s);\n    }\n    modbus_close(ctx);\n    modbus_free(ctx);\n}\n```\n\n**RTU-Slave\u6d41\u7a0b\u603b\u7ed3:**\n\n- \u521d\u59cb\u5316 modbus \u6307\u9488;\n\n- \u8bbe\u7f6e\u4ece\u7ad9ID;\n\n- modbus_mapping_new\u521d\u59cb\u5316\u5bc4\u5b58\u5668\uff0c\u8fd4\u56de\u4e00\u4e2amodbus_mapping_t \u6307\u9488;\n\n- \u5efa\u7acb\u8fde\u63a5;\n\n- \u8c03\u7528 modbus_receive \u51fd\u6570\u5224\u65ad\u4e32\u53e3\u7684\u63a5\u6536\u6570\u636e\uff0c\u8d1f\u8d23\u63a5\u6536\u5904\u7406\u53ca\u56de\u590d\u3002\n\n**TCP master**\n\n```\n#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;error.h&gt;\n#include &lt;memory.h&gt;\n#include &lt;sys\/socket.h&gt;\n#include \"modbus.h\"\n\nvoid main(void)\n{\n    int i;\n    int regs = 0;\n    int num = 0;\n    modbus_t *ctx = NULL;\n    uint16_t tab_reg&#91;64] = {0};\n   \n    ctx = modbus_new_tcp(\"127.0.0.1\",8000);\n    modbus_set_slave(ctx, 1);\n    modbus_connect(ctx);\n    modbus_set_response_timeout(ctx, 0, 1000000);\n   \n    while (1)\n    {\n        memset(tab_reg, 0, sizeof(tab_reg));\n        regs = modbus_read_registers(ctx, 0, 20, tab_reg);\n        printf(\"&#91;%4d]&#91;read num = %d]\", num++, regs);\n        for (i = 0; i &lt; 20; i++)\n        {\n            printf(\"&lt;%#x&gt;\", tab_reg&#91;i]);\n        }\n        printf(\"\\n\");\n        sleep(1);\n    }\n\n    modbus_close(ctx);\n    modbus_free(ctx);\n}\n```\n\n**TCP slave**\n\n```\n#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;error.h&gt;\n#include &lt;memory.h&gt;\n#include &lt;sys\/socket.h&gt;\n#include \"modbus.h\"\n\nint main(void)\n{ \n    int i = 0;\n    int rc = 0;\n    modbus_t *ctx = NULL;\n    modbus_mapping_t *mb_mapping = NULL;\n    uint8_t query&#91;MODBUS_TCP_MAX_ADU_LENGTH];\n\n    \/\/\u6253\u5f00\u7aef\u53e3: ip, port\n    ctx = modbus_new_tcp(\"127.0.0.1\", 8000);\n    \/\/\u8bbe\u7f6e\u4ece\u673a\u5730\u5740\n    modbus_set_slave(ctx, 1);\n    \/\/\u5efa\u7acb\u8fde\u63a5\n    if (modbus_connect(ctx) == -1) {\n        fprintf(stderr, \"Connexion failed: %s\\n\", modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,\n                                    MODBUS_MAX_READ_REGISTERS, 0);\n    if (mb_mapping == NULL) {\n        fprintf(stderr, \"Failed to allocate the mapping: %s\\n\",\n                modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n\n   \/\/\u521d\u59cb\u5316\u51e0\u4e2a\u5bc4\u5b58\u5668\n   mb_mapping-&gt;tab_registers&#91;0] = 1;\n   mb_mapping-&gt;tab_registers&#91;1] = 2;\n   mb_mapping-&gt;tab_registers&#91;2] = 3;\n   mb_mapping-&gt;tab_registers&#91;3] = 4;\n   mb_mapping-&gt;tab_registers&#91;4] = 5;\n   mb_mapping-&gt;tab_registers&#91;5] = 6;\n\n    while (1)\n    {\n        memset(query, 0, sizeof(query));\n        rc = modbus_receive(ctx, query);\n        if (rc &gt; 0) {\n            modbus_reply(ctx, query, rc, mb_mapping);\n        } else if (rc  == -1) {\n            \/\/Connection closed by the client or error\n            break;\n        }\n    }\n\n    printf(\"Quit the loop: %s\\n\", modbus_strerror(errno));\n\n    modbus_mapping_free(mb_mapping);\n    if (s != -1) {\n        close(s);\n    }\n    modbus_close(ctx);\n    modbus_free(ctx);\n}\n```\n\n---\n*modbus.cn*\n"