{"id":11114,"date":"2022-11-18T14:42:39","date_gmt":"2022-11-18T06:42:39","guid":{"rendered":"https:\/\/www.modbus.cn\/?p=11114"},"modified":"2022-11-18T14:44:23","modified_gmt":"2022-11-18T06:44:23","slug":"modbus-rtu-kai-fa-shi-li","status":"publish","type":"post","link":"https:\/\/www.modbus.cn\/en\/11114.html","title":{"rendered":"Modbus RTU \u5f00\u53d1\u793a\u4f8b"},"content":{"rendered":"<p class=\"wp-block-paragraph\">\u672c\u6587\u5728 Linux \u4e0a\u57fa\u4e8e libmodbus \u5e93\u8fdb\u884c Modbus RTU \u5f00\u53d1\uff0c\u5728\u8fdb\u884c\u5b9e\u9a8c\u4e4b\u524d\u9700\u8981\u5148\u5b89\u88c5 libmodbus \u5e93\uff0c\u4ee5\u53ca socat \u5de5\u5177\u5b9e\u73b0\u865a\u62df\u4e32\u53e3\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u51c6\u5907\u5de5\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b89\u88c5 libmodbus<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u6309&nbsp;<a href=\"https:\/\/getiot.tech\/modbus\/libmodbus.html\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\">libmodbus \u8f6f\u4ef6\u5e93<\/a>&nbsp;\u4e2d\u300c\u5b89\u88c5\u300d\u4e00\u8282\u7684\u6b65\u9aa4\u8fdb\u884c\u624b\u52a8\u7f16\u8bd1\u5b89\u88c5\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b89\u88c5 socat<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install socat\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">socat \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u7f51\u7edc\u5de5\u5177\uff0c\u672c\u5b9e\u9a8c\u5c06\u501f\u52a9\u5b83\u6765\u5b9e\u73b0\u4e24\u4e2a\u76f8\u4e92\u8fde\u63a5\u7684\u865a\u62df\u4e32\u53e3\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u51c6\u5907\u771f\u5b9e\u7684\u4e32\u53e3\u8bbe\u5907\u3002\u5173\u4e8e socat \u7684\u8be6\u7ec6\u7528\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003&nbsp;<a href=\"https:\/\/getiot.tech\/linux-command\/socat.html\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\">socat \u547d\u4ee4<\/a>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ee3\u7801\u5b9e\u73b0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b8c\u6574\u4ee3\u7801\u53ef\u4ece&nbsp;<a href=\"https:\/\/github.com\/getiot\/linux-c\/tree\/main\/library\/libmodbus\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/getiot\/linux-c\/tree\/main\/library\/libmodbus<\/a>&nbsp;\u83b7\u53d6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Modbus RTU \u4ece\u7ad9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#ifndef _MSC_VER\n#include &lt;unistd.h&gt;\n#endif\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;errno.h&gt;\n#include &lt;stdbool.h&gt;\n#include \"modbus.h\" \/\/ \u5f15\u7528libmodbus\u5e93\n\n#define Loop             1      \/\/ \u5faa\u73af\u6b21\u6570\n#define Server_ID       17      \/\/ \u4ece\u7aef\u8bbe\u5907\u5730\u5740\n#define ADDRESS_START    0      \/\/ \u6d4b\u8bd5\u5bc4\u5b58\u5668\u8d77\u59cb\u5730\u5740\n#define ADDRESS_END     99      \/\/ \u6d4b\u8bd5\u5bc4\u5b58\u5668\u7ed3\u675f\u5730\u5740\n\nint main(int argc, char *argv&#91;])\n{\n    modbus_t *ctx = NULL;\n    int nb = 0; \/\/ \u9700\u8981\u6d4b\u8bd5\u7684\u5bc4\u5b58\u5668\u4e2a\u6570\n    uint8_t* tab_rq_bits;       \/\/ \u7528\u4e8e\u4fdd\u5b58\u53d1\u9001\u6216\u63a5\u6536\u7684\u6570\u636e\uff08\u4e0b\u540c\uff09\n    uint8_t* tab_rp_bits;\n    uint16_t *tab_rq_registers;\n    uint16_t *tab_rw_rq_registers;\n    uint16_t *tab_rp_registers;\n    char *port;\n    modbus_mapping_t *mb_mapping;\n\n    if (argc == 2) {\n        port = argv&#91;1];\n    } else {\n        port = \"COM5\";\n    }\n\n    \/\/ \u521b\u5efa\u4e00\u4e2aRTU\u7c7b\u578b\u7684\u5bb9\u5668\n    ctx = modbus_new_rtu(port, 19200, 'N', 8, 1);\n    \/\/ \u8bbe\u7f6e\u4ece\u7aef\u5730\u5740\n    modbus_set_slave(ctx, Server_ID);\n    \/\/ \u8bbe\u7f6edebug\u6a21\u5f0f\n    modbus_set_debug(ctx, true);\n    \/\/ RTU \u6a21\u5f0f\u4e0b\u8868\u793a\u6253\u5f00\u4e32\u53e3\n    if (modbus_connect(ctx) == -1)\n    {\n        fprintf(stderr, \"Connection failed: %s \\n\", modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n\n    \/\/ \u7533\u8bf74\u5757\u5185\u5b58\u533a\u7528\u4ee5\u5b58\u653e\u5bc4\u5b58\u5668\u6570\u636e\uff0c\u8fd9\u91cc\u7533\u8bf7500\u4e2a\u5bc4\u5b58\u5668\u5730\u5740\n    mb_mapping = modbus_mapping_new(500, 500, 500, 500);\n    if (mb_mapping == NULL) {\n        fprintf(stderr, \"Error mapping: %s \\n\",modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n\n    \/\/ \u5faa\u73af\u63a5\u6536\u67e5\u8be2\u5e27\u5e76\u56de\u590d\u6d88\u606f\n    for (;;) {\n        uint8_t query&#91;MODBUS_TCP_MAX_ADU_LENGTH];\n        int rc = 0;\n        rc = modbus_receive(ctx, query);\/\/\u83b7\u53d6\u67e5\u8be2\u62a5\u6587\n\n        if (rc &gt;= 0) {\n            \/\/ rc is the qury size\n            modbus_reply(ctx, query, rc, mb_mapping); \/\/ \u56de\u590d\u54cd\u5e94\u62a5\u6587\n        }\n        else {\n            \/\/ connection closed by the client or error\n            printf(\"Connection Closed\\n\");\n        }\n    }\n    printf(\"Quit the loop : %s \\n\", modbus_strerror(errno));\n\n    \/\/ \u91ca\u653e\u5185\u5b58\n    modbus_mapping_free(mb_mapping);\n    modbus_close(ctx);\n    modbus_free(ctx);\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Modbus RTU \u4e3b\u7ad9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#ifndef _MSC_VER\n#include &lt;unistd.h&gt;\n#endif\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;errno.h&gt;\n#include &lt;stdbool.h&gt;\n#include \"modbus.h\" \/\/ \u5f15\u7528libmodbus\u5e93\n\n#define Loop             1        \/\/ \u5faa\u73af\u6b21\u6570\n#define Server_ID       17        \/\/ \u4ece\u7aef\u8bbe\u5907\u5730\u5740\n#define ADDRESS_START    0        \/\/ \u6d4b\u8bd5\u5bc4\u5b58\u5668\u8d77\u59cb\u5730\u5740\n#define ADDRESS_END     99        \/\/ \u6d4b\u8bd5\u5bc4\u5b58\u5668\u7ed3\u675f\u5730\u5740\n\nint main(int argc, char *argv&#91;])\n{\n    \/\/ printf(\"%c\", 0b01000001); \/\/ A\n    modbus_t *ctx = NULL;\n\n    int nb = 0; \/\/ \u9700\u8981\u6d4b\u8bd5\u7684\u5bc4\u5b58\u5668\u4e2a\u6570\n\n    uint8_t* tab_rq_bits;       \/\/ \u7528\u4e8e\u4fdd\u5b58\u53d1\u9001\u6216\u63a5\u6536\u7684\u6570\u636e\uff08\u4e0b\u540c\uff09\n    uint8_t* tab_rp_bits;\n\n    uint16_t *tab_rq_registers;\n    uint16_t *tab_rw_rq_registers;\n    uint16_t *tab_rp_registers;\n    char *port;\n\n    if (argc == 2) {\n        port = argv&#91;1];\n    } else {\n        port = \"COM4\";\n    }\n\n    \/\/ \u521b\u5efa\u4e00\u4e2aRTU\u7c7b\u578b\u7684\u5bb9\u5668\n    ctx = modbus_new_rtu(port, 19200, 'N', 8, 1);\n    \/\/ \u8bbe\u7f6e\u4ece\u7aef\u5730\u5740\n    modbus_set_slave(ctx, Server_ID);\n    \/\/ \u8bbe\u7f6edebug\u6a21\u5f0f\n    modbus_set_debug(ctx, true);\n    \/\/ RTU \u6a21\u5f0f\u4e0b\u8868\u793a\u6253\u5f00\u4e32\u53e3\n    if (modbus_connect(ctx) == -1) {\n        fprintf(stderr, \"Connection failed: %s \\n\", modbus_strerror(errno));\n        modbus_free(ctx);\n        return -1;\n    }\n    printf(\"Connection successed\\n\");\n\n    \/*Allocate and initialize the different memory space *\/\n    \/\/ \u8ba1\u7b97\u9700\u8981\u6d4b\u8bd5\u7684\u5bc4\u5b58\u5668\u4e2a\u6570\n    nb = ADDRESS_END - ADDRESS_START;\n\n    \/\/ \u4ee5\u4e0b\u7533\u8bf7\u5185\u5b58\u5757\uff0c\u6cf3\u8863\u4fdd\u5b58\u53d1\u9001\u548c\u63a5\u6536\u5404\u6570\u636e\n    tab_rq_bits = (uint8_t*)malloc(nb * sizeof(uint8_t));\n    memset(tab_rq_bits, 0, nb*sizeof(uint8_t));\n\n    tab_rp_bits = (uint8_t*)malloc(nb * sizeof(uint8_t));\n    memset(tab_rp_bits, 0, nb*sizeof(uint8_t));\n\n    tab_rq_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));\n    memset(tab_rq_registers, 0, nb*sizeof(uint16_t));\n\n    tab_rw_rq_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));\n    memset(tab_rw_rq_registers, 0, nb*sizeof(uint16_t));\n\n    tab_rp_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));\n    memset(tab_rp_registers, 0, nb*sizeof(uint16_t));\n\n    int nb_loop = 0, nb_fail = 0, addr = 0, rc = 0;\n\n    while (nb_loop++ &lt; Loop) {\n        \/\/ \u4ece\u8d77\u59cb\u5730\u5740\u5f00\u59cb\u987a\u5e8f\u6d4b\u8bd5\n        for (addr = ADDRESS_START; addr &lt; ADDRESS_END; addr++) {\n            sleep(1);\n            int i = 0;\n\n            \/\/ \u751f\u6210\u968f\u673a\u6570\u7528\u4e8e\u6d4b\u8bd5\n            for (i = 0; i &lt; nb; i++) {\n                tab_rq_registers&#91;i] = (uint16_t)(65535.0 * rand() \/ (RAND_MAX + 1.0));\n                tab_rw_rq_registers&#91;i] = ~tab_rq_registers&#91;i];\n                tab_rq_bits&#91;i] = tab_rq_registers&#91;i] % 2;\n            }\n            nb = ADDRESS_END - addr;\n\n            \/\/ \u6d4b\u8bd5\u7ebf\u5708\u5bc4\u5b58\u5668\u7684\u5355\u4e2a\u8bfb\u5199\n            printf(\"modbus_write_bit()...\\n\");\n            rc = modbus_write_bit(ctx, addr, tab_rq_bits&#91;0]); \/\/ \u5199\u7ebf\u5708\u5bc4\u5b58\u5668\n            if (rc != 1) {\n                printf(\"ERROR modbus_write_bit (%d)\\n\", rc);\n                printf(\"Address = %d,value = %d \\n\", addr, tab_rq_bits&#91;0]);\n                nb_fail++;\n            }\n            else {\n                \/\/ \u5199\u5165\u4e4b\u540e\uff0c\u518d\u8bfb\u53d6\u5e76\u6bd4\u8f83\n                rc = modbus_read_bits(ctx, addr, 1, tab_rp_bits);\n                if (rc != 1 || tab_rq_bits&#91;0] != tab_rp_bits&#91;0]) {\n                    printf(\"ERROR modbus_read_bits single(%d)\\n\", rc);\n                    printf(\"address = %d\\n\", addr);\n                    nb_fail++;\n                }\n            }\n\n            \/\/ \u6d4b\u8bd5\u7ebf\u5708\u5bc4\u5b58\u5668\u7684\u6279\u91cf\u8bfb\u5199\n            printf(\"modbus_write_bits()...\\n\");\n            rc = modbus_write_bits(ctx, addr, nb, tab_rq_bits);\n            if (rc != nb) {\n                printf(\"ERROR modbus_write_bits (%d)\\n\", rc);\n                printf(\"Address = %d,nb = %d\\n\", addr, nb);\n                nb_fail++;\n            }\n            else {\n                \/\/ \u5199\u5165\u4e4b\u540e\uff0c\u518d\u8bfb\u53d6\u5e76\u6bd4\u8f83\n                rc = modbus_read_bits(ctx, addr, nb, tab_rp_bits);\n                if (rc != nb) {\n                    printf(\"ERROR modbus_read_bits \\n\");\n                    printf(\"address = %d,nb = %d\\n\", addr, nb);\n                    nb_fail++;\n                }\n                else {\n                    \/\/ \u8fdb\u884c\u6bd4\u8f83\n                    for (i = 0; i &lt; nb; i++) {\n                        if (tab_rp_bits&#91;i] != tab_rq_bits&#91;i]) {\n                            printf(\"ERROR modbus_read_bits (%d)\\n\", rc);\n                            printf(\"Address = %d, Val = %d(0x%x) != %d (0x%x)\\n\",\n                                addr, tab_rq_bits&#91;i], tab_rq_bits&#91;i],\n                                tab_rp_bits&#91;i], tab_rp_bits&#91;i]);\n                            nb_fail++;\n                        }\n                    }\n                }\n            }\n\n            \/\/ \u6d4b\u8bd5\u4fdd\u6301\u5bc4\u5b58\u5668\u7684\u5355\u4e2a\u8bfb\u5199\n            printf(\"modbus_write_register()...\\n\");\n            rc = modbus_write_register(ctx, addr, tab_rq_registers&#91;0]);\n            if (rc != 1) {\n                printf(\"ERROR modbus_read_bits (%d)\\n\", rc);\n                printf(\"Address = %d, Val = %d(0x%x)\\n\",\n                    addr, tab_rq_registers&#91;0], tab_rq_registers&#91;0]);\n                nb_fail++;\n            }\n            else {\n                \/\/ \u5199\u5165\u4e4b\u540e\u8fdb\u884c\u8bfb\u53d6\n                rc = modbus_read_registers(ctx, addr, 1, tab_rp_registers);\n                if (rc != 1) {\n                    printf(\"ERROR modbus_read_registers (%d)\\n\", rc);\n                    printf(\"Address = %d\\n\", addr);\n                    nb_fail++;\n                }\n                else {\n                    \/\/ \u8bfb\u53d6\u540e\u8fdb\u884c\u6bd4\u8f83\n                    if (tab_rq_registers&#91;0] != tab_rp_registers&#91;0]) {\n                        printf(\"ERROR modbus_read_registers (%d)\\n\", rc);\n                        printf(\"Address = %d, Val = %d(0x%x) != %d (0x%x)\\n\",\n                            addr, tab_rq_registers&#91;0], tab_rq_registers&#91;0],\n                            tab_rp_registers&#91;0], tab_rp_registers&#91;0]);\n                        nb_fail++;\n                    }\n                }\n            }\n\n            \/\/ \u6d4b\u8bd5\u7ebf\u5708\u5bc4\u5b58\u5668\u7684\u6279\u91cf\u8bfb\u5199\n            printf(\"modbus_write_registers()...\\n\");\n            rc = modbus_write_registers(ctx, addr, nb, tab_rq_registers);\n            if (rc != nb) {\n                printf(\"ERROR modbus_write_bits (%d)\\n\", rc);\n                printf(\"Address = %d, nb = %d \\n\", addr, nb);\n                nb_fail++;\n            }\n            else {\n                \/\/ \u8fdb\u884c\u8bfb\u53d6\u6d4b\u8bd5\n                rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);\n                if (rc != nb) {\n                    printf(\"ERROR modbus_read_registers (%d)\\n\", rc);\n                    printf(\"Address = %d\\n\", addr);\n                    nb_fail++;\n                }\n                else {\n                    for (i = 0; i &lt; nb; i++) {\n                        \/\/ \u8bfb\u53d6\u540e\u8fdb\u884c\u6bd4\u8f83\n                        if (tab_rq_registers&#91;i] != tab_rp_registers&#91;i]) {\n                            printf(\"ERROR modbus_read_registers (%d)\\n\", rc);\n                            printf(\"Address = %d, Val = %d(0x%x) != %d (0x%x)\\n\",\n                                addr, tab_rq_registers&#91;0], tab_rq_registers&#91;0],\n                                tab_rp_registers&#91;0], tab_rp_registers&#91;0]);\n                            nb_fail++;\n                        }\n                    }\n                }\n            }\n\n            \/\/ \u529f\u80fd\u7801 23 \uff080x17\uff09 \u8bfb\u5199\u591a\u4e2a\u5bc4\u5b58\u5668\u7684\u6d4b\u8bd5\n            printf(\"modbus_write_and_read_registers()...\\n\");\n            rc = modbus_write_and_read_registers(ctx,\n                addr, nb, tab_rw_rq_registers,\n                addr, nb, tab_rp_registers);\n\n            if (rc != nb) {\n                printf(\"ERROR modbus_read_ad_write_registers (%d)\\n\", rc);\n                printf(\"Address = %d,nb = %d\\n\", addr, nb);\n                nb_fail++;\n            }\n            else {\n                \/\/ \u8bfb\u53d6\u5e76\u6bd4\u8f83\n                for (i = 0; i &lt; nb; i++) {\n                    if (tab_rp_registers&#91;i] &lt; tab_rw_rq_registers&#91;i]) {\n                        printf(\"ERROR modbus_read_and_write_registers READ\\n\");\n                        printf(\"Address = %d,value %d (0x%X) != %d (0x%X)\\n\",\n                            addr, tab_rp_registers&#91;i], tab_rw_rq_registers&#91;i],\n                            tab_rp_registers&#91;i, tab_rw_rq_registers&#91;i]]);\n                        nb_fail++;\n                    }\n                }\n\n                rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);\n                if (rc != nb) {\n                    printf(\"ERROR modbus_read_registers (%d) \\n\", rc);\n                    printf(\"Address = %d,nb = %d\\n\", addr, nb);\n                }\n                else {\n                    for (i = 0; i &lt; nb; i++) {\n                        if (tab_rw_rq_registers&#91;i] != tab_rp_registers&#91;i]) {\n                            printf(\"ERROR modbus_read_and_write_registers \\n\");\n                            printf(\"Address = %d,value %d (0x%X) != %d (0x%X)\\n\",\n                                addr, tab_rw_rq_registers&#91;i], tab_rw_rq_registers&#91;i],\n                                tab_rp_registers&#91;i], tab_rp_registers&#91;i]);\n                            nb_fail++;\n                        }\n                    }\n                }\n            }\n        }\n\n        printf(\"Test: \");\n        if (nb_fail) {\n            printf(\"%d FAILS\\n\",nb_fail);\n        } else {\n            printf(\"SUCCESS\\n\");\n        }\n    }\n\n    \/\/ FREE the memory\n    free(tab_rq_bits);\n    free(tab_rp_bits);\n    free(tab_rq_registers);\n    free(tab_rp_registers);\n    free(tab_rw_rq_registers);\n\n    \/\/ close the connection\n    modbus_close(ctx);\n    modbus_free(ctx);\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Makefile<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>CC=gcc\nCFLAGS=-I\/usr\/local\/include\/modbus\/ -lmodbus -g\n\nMASTER=modbus-rtu-master\nSLAVE=modbus-rtu-slave\n\nall:\n        (CC) -o(MASTER) (MASTER).c(CFLAGS)\n        (CC) -o(SLAVE) (SLAVE).c(CFLAGS)\n\nclean:\n        rm -rf (MASTER)(SLAVE)\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d4b\u8bd5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8\u865a\u62df\u4e32\u53e3<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ socat  -d  -d  PTY  PTY\n2021\/07\/16 14:36:43 socat&#91;23932] N PTY is \/dev\/pts\/7\n2021\/07\/16 14:36:43 socat&#91;23932] N PTY is \/dev\/pts\/8\n2021\/07\/16 14:36:43 socat&#91;23932] N starting data transfer loop with FDs &#91;5,5] and &#91;7,7]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8\u4ece\u7ad9\u8bbe\u5907\uff0c\u7b49\u5f85\u4e3b\u7ad9\u6307\u4ee4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/modbus-rtu-slave \/dev\/pts\/7\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8\u4e3b\u7ad9\u8bbe\u5907\uff0c\u4f9d\u6b21\u7ed9\u4ece\u7ad9\u4e0b\u53d1\u6307\u4ee4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/modbus-rtu-master \/dev\/pts\/8\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u73b0\u5728\uff0c\u4f60\u53ef\u4ee5\u4ece\u7ec8\u7aef\u770b\u5230 Modbus RTU \u4e3b\u7ad9\u548c\u4ece\u7ad9\u7684\u6570\u636e\u901a\u4fe1\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https%3A%2F%2Fgetiot.tech%2Fmodbus%2Fmodbus-rtu-example.html\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\"><\/a><a href=\"https:\/\/twitter.com\/share?url=https%3A%2F%2Fgetiot.tech%2Fmodbus%2Fmodbus-rtu-example.html&amp;text=Modbus%20RTU%20%E5%BC%80%E5%8F%91%E7%A4%BA%E4%BE%8B\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\"><\/a><a href=\"https:\/\/getiot.tech\/modbus\/modbus-rtu-example.html#\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\"><\/a><a href=\"https:\/\/www.linkedin.com\/shareArticle?url=https%3A%2F%2Fgetiot.tech%2Fmodbus%2Fmodbus-rtu-example.html&amp;title=Modbus%20RTU%20%E5%BC%80%E5%8F%91%E7%A4%BA%E4%BE%8B\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\"><\/a><a href=\"https:\/\/news.ycombinator.com\/submitlink?u=https%3A%2F%2Fgetiot.tech%2Fmodbus%2Fmodbus-rtu-example.html&amp;t=Modbus%20RTU%20%E5%BC%80%E5%8F%91%E7%A4%BA%E4%BE%8B\" target=\"_blank\" rel=\"noopener noreferrer nofollow noreferrer noopener\"><\/a><a href=\"https:\/\/getiot.tech\/linux-command\/socat.html\" rel=\"noopener noreferrer nofollow\"><\/a><\/p>\n<span id=\"magicpostMarker\"><\/span>","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u5728 Linux \u4e0a\u57fa\u4e8e libmodbus \u5e93\u8fdb\u884c Mo&#8230;<\/p>","protected":false},"author":1,"featured_media":27977,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[1394],"tags":[1281,1284,1282,1283,1184],"class_list":["post-11114","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-modbus-protocol","tag-_","tag-errno","tag-r","tag-strerror","tag-1184"],"_links":{"self":[{"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/posts\/11114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/comments?post=11114"}],"version-history":[{"count":0,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/posts\/11114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/media\/27977"}],"wp:attachment":[{"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/media?parent=11114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/categories?post=11114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modbus.cn\/en\/wp-json\/wp\/v2\/tags?post=11114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}