{"id":6809,"date":"2020-12-21T11:58:56","date_gmt":"2020-12-21T03:58:56","guid":{"rendered":"https:\/\/blog.hoyo.idv.tw\/?p=6809"},"modified":"2023-04-14T09:14:29","modified_gmt":"2023-04-14T01:14:29","slug":"esp8266-rs485-modbus-%e9%80%9a%e8%a8%8a","status":"publish","type":"post","link":"https:\/\/blog.hoyo.idv.tw\/?p=6809","title":{"rendered":"ESP8266 - RS485 Modbus \u901a\u8a0a"},"content":{"rendered":"<p>--<\/p>\n<h2>MAX485<\/h2>\n<ul>\n<li><a href=\"https:\/\/msp430teaching.wordpress.com\/2019\/01\/08\/%E3%80%90msp430%E9%96%8B%E7%99%BC%E6%97%A5%E8%AA%8C%E3%80%91uart%E5%BB%B6%E4%BC%B8%E6%87%89%E7%94%A8rs485max485%E6%A8%A1%E7%B5%84-%E5%89%8D%E8%A8%80%E8%88%87%E6%BA%96%E5%82%99\/\" target=\"_blank\" rel=\"noopener\">\u3010MSP430\u958b\u767c\u65e5\u8a8c\u3011UART\u5ef6\u4f38\u61c9\u7528RS485(MAX485\u6a21\u7d44) \u2013 \u524d\u8a00\u8207\u6e96\u5099<\/a><\/li>\n<\/ul>\n<p>\u6700\u5f8c\u7684\u8173\u4f4d\u5c0d\u61c9\u70ba<\/p>\n<pre class=\"lang:default decode:true\">RO =&gt; RXD = D5\r\nDI =&gt; TXD = D6\r\nTR = D2<\/pre>\n<p>--<\/p>\n<h2>SoftwareSerial<\/h2>\n<p>\u56e0\u70ba\u4f7f\u7528\u4e86 UART \u8f49 RS485 \u5c0f\u677f\uff0c\u56e0\u6b64\u53ea\u8981\u8a2d\u5b9a\u597d\u9b91\u7387\u3001\u50b3\u9001\u7684\u8cc7\u6599\u53ca\u8a08\u7b97 CRC \u5373\u53ef<\/p>\n<ul>\n<li><a href=\"https:\/\/www.instructables.com\/id\/ESP8266-Two-Serial-Ports-With-SoftwareSerial-Libra\/\" target=\"_blank\" rel=\"noopener\">ESP8266 Two Serial Ports With SoftwareSerial Library<\/a><\/li>\n<\/ul>\n<pre class=\"lang:arduino decode:true \">#include &lt;SoftwareSerial.h&gt;\r\n\r\nSoftwareSerial mySerial(14, 12); \/\/ RX, TX\r\n\r\n#define DE 4     \/\/ D6\u4f7f\u80fd\u767c\u9001\u5668\uff0c\u9ad8\u96fb\u5e73\u6709\u6548\r\n\r\nvoid setup()\r\n{\r\n    pinMode(not_RE, OUTPUT);\r\n    pinMode(DE, OUTPUT);\r\n    digitalWrite(not_RE, HIGH); \/\/ disable receiver\r\n    digitalWrite(DE, HIGH);     \/\/ enable transmitter\r\n\r\n    Serial.begin(57600);\r\n    mySerial.begin(9600);\r\n}\r\n\r\nvoid loop()\r\n{\r\n    Serial.println(\"aaa\");\r\n    mySerial.println(\"aaa\");\r\n    delay(100);\r\n}<\/pre>\n<p>--<\/p>\n<h2>CRC<\/h2>\n<ul>\n<li><a href=\"https:\/\/forum.arduino.cc\/index.php?topic=327623.0\" target=\"_blank\" rel=\"noopener\">Arduino and RS485 communication<\/a><\/li>\n<\/ul>\n<pre class=\"lang:arduino decode:true\">uint16_t CalcCRC(byte * data, uint8_t datlen) {\r\n  uint16_t CRC = 0xFFFF; \/\/ Init CRC\r\n  uint8_t xor_flag;\r\n  for (uint8_t n = 0; n &lt; datlen; n++) {\r\n    CRC = CRC ^ data[n];\r\n    for (uint8_t i = 0; i &lt; 8; i++) {\r\n      if (CRC &amp; 0x0001) {\r\n        xor_flag = 1;\r\n      }\r\n      else {\r\n        xor_flag = 0;\r\n      }\r\n      CRC = CRC &gt;&gt; 1;\r\n      if (xor_flag) {\r\n        CRC = CRC ^ 0xA001;\r\n      }\r\n    }\r\n  }\r\n  return CRC;\r\n}\r\n\r\nvoid SendCmd( byte * data, uint8_t datlen) { \/\/ this is just a test routine to send results Serial Monitor.\r\n  uint16_t CRC = CalcCRC(data, datlen);\r\n  for (uint8_t i = 0; i &lt; datlen; i++) { \/\/ set TX mode, use the correct Serial (softSerial?)\r\n    Serial.print(data[i], HEX);\r\n    Serial.print(' ');\r\n  }\r\n  Serial.print(lowByte(CRC), HEX); \/\/ This does not match the Example. It could be an error in the manual.\r\n  Serial.print(' ');              \/\/ If the device does not respond, reverse the order byte order the CRC\r\n  Serial.println(highByte(CRC), HEX); \/\/ is sent.  Send highbyte then lowByte.\r\n}<\/pre>\n<p>\u4ee5\u00a0{0x01, 0x03, 0x00, 0x00, 0x00, 0x02} \u70ba\u4f8b\uff0c\u7b97\u51fa\u4f86\u61c9\u8a72\u662f 0xC4, 0x0B \u624d\u5c0d<\/p>\n<p>--<\/p>\n<h2>\u786c\u9ad4\u63a5\u7dda<\/h2>\n<figure id=\"attachment_7788\" aria-describedby=\"caption-attachment-7788\" style=\"width: 225px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143233.jpg\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" class=\"size-medium wp-image-7788\" src=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143233-225x300.jpg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143233-225x300.jpg 225w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143233-768x1024.jpg 768w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><figcaption id=\"caption-attachment-7788\" class=\"wp-caption-text\">\u6b63\u9762<\/figcaption><\/figure>\n<figure id=\"attachment_7789\" aria-describedby=\"caption-attachment-7789\" style=\"width: 225px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143247.jpg\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" class=\"size-medium wp-image-7789\" src=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143247-225x300.jpg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143247-225x300.jpg 225w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/IMG_20201217_143247-768x1024.jpg 768w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><figcaption id=\"caption-attachment-7789\" class=\"wp-caption-text\">\u80cc\u9762<\/figcaption><\/figure>\n<p>--<\/p>\n<h2>\u7a0b\u5f0f\u7bc4\u4f8b<\/h2>\n<pre class=\"lang:arduino decode:true\">#include &lt;SoftwareSerial.h&gt;\r\n\r\nSoftwareSerial rs485;\r\n\r\n#define DE 4\r\n\r\nbyte s[] = {0x60, 0x03, 0x00, 0x00, 0x00, 0x10};\r\nbyte r[sizeof(s) + 2];\r\n\r\nuint16_t CalcCRC(byte * data, uint8_t datlen) {\r\n  uint16_t CRC = 0xFFFF; \/\/ Init CRC\r\n  uint8_t xor_flag;\r\n  for (uint8_t n = 0; n &lt; datlen; n++) {\r\n    CRC = CRC ^ data[n];\r\n    for (uint8_t i = 0; i &lt; 8; i++) {\r\n      if (CRC &amp; 0x0001) {\r\n        xor_flag = 1;\r\n      }\r\n      else {\r\n        xor_flag = 0;\r\n      }\r\n      CRC = CRC &gt;&gt; 1;\r\n      if (xor_flag) {\r\n        CRC = CRC ^ 0xA001;\r\n      }\r\n    }\r\n  }\r\n  return CRC;\r\n}\r\n\r\nvoid printHex(uint8_t num) {\r\n  char hexCar[2];\r\n  sprintf(hexCar, \"%02X\", num);\r\n  Serial.print(hexCar);\r\n}\r\n\r\nvoid setup()\r\n{\r\n  pinMode(DE, OUTPUT);\r\n  Serial.begin(9600);\r\n  rs485.begin(2400, SWSERIAL_8N1, 14, 12);\r\n\r\n  for ( int i = 0; i &lt; sizeof(s); i++ ) {\r\n    r[i] = s[i];\r\n  }\r\n}\r\n\r\nvoid loop()\r\n{\r\n  digitalWrite(DE, HIGH);\r\n\r\n  uint16_t CRC = CalcCRC(s, 6);\r\n  r[6] = lowByte(CRC);\r\n  r[7] = highByte(CRC);\r\n\r\n  rs485.write(r, sizeof(r));\r\n\r\n  digitalWrite(DE, LOW);\r\n  delay(300);\r\n\r\n  for ( int i = 0; i &lt; sizeof(r); i++ ) {\r\n    printHex(r[i]);\r\n  }\r\n  Serial.println();\r\n\r\n  if (rs485.available() &gt; 0)\r\n  {\r\n    while (rs485.available() &gt; 0)\r\n    {\r\n      Serial.print(rs485.read());\r\n      Serial.print(',');\r\n      yield();\r\n    }\r\n    Serial.println();\r\n  }\r\n  delay(1000);\r\n\r\n}<\/pre>\n<p>\u904b\u884c\u7d50\u679c<\/p>\n<p><a href=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528.png\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" class=\"alignnone size-medium wp-image-7729\" src=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528-300x154.png\" alt=\"\" width=\"300\" height=\"154\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528-300x154.png 300w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528-768x393.png 768w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528-1024x524.png 1024w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528-500x256.png 500w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2020\/12\/20201204_155528.png 1072w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>--<\/p>\n<h2>\u6ce8\u610f\u4e8b\u9805<\/h2>\n<ul>\n<li>\u5982\u679c\u9078\u64c7\u7684 GPIO \u6703\u5f71\u97ff\u71d2\u9304\uff0c\u90a3\u91cd\u65b0\u958b\u6a5f\u4e5f\u6703\u5f71\u97ff\u7a0b\u5f0f\u904b\u4f5c\uff0c\u5fc5\u9808\u5148\u65b7\u958b\u958b\u6a5f\u5b8c\u6210\u624d\u6703\u904b\u4f5c\uff0c\u6240\u4ee5\u9084\u662f\u9700\u8981\u53e6\u5916\u9078\u4e0d\u6703\u5f71\u97ff\u7684\u8173\u4f4d\u3002<\/li>\n<\/ul>\n<p>--<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"6809\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;4,324&nbsp;total views, &nbsp;1&nbsp;views today<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>-- MAX485 \u3010MSP4...<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"6809\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;4,324&nbsp;total views, &nbsp;1&nbsp;views today<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[273,272],"tags":[275,331],"_links":{"self":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/6809"}],"collection":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6809"}],"version-history":[{"count":25,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/6809\/revisions"}],"predecessor-version":[{"id":12038,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/6809\/revisions\/12038"}],"wp:attachment":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}