"# VisualHMI \u81ea\u7531\u4e32\u53e3\u534f\u8bae\uff08\u88ab\u52a8\uff09\uff1aon_uart_recv \u81ea\u5b9a\u4e49\u5e27\u89e3\u6790\n\n> 2026-08-04 | 2026-08-04\n> http:\/\/www.modbus.cn\/en\/51513.html\n\n**LUA \u811a\u672c, \u4e32\u53e3\u5c4f\/HMI \u5f00\u53d1**\n\n---\n\n\u628a\u4e32\u53e3\u534f\u8bae\u5b8c\u5168\u4ea4\u7ed9 LUA \u811a\u672c\u5904\u7406\uff08\u81ea\u5b9a\u4e49\u5e27\u534f\u8bae\uff09\uff0c\u7528\u4e8e\u5bf9\u63a5\u79c1\u6709\u534f\u8bae\u8bbe\u5907\u3002\u8fd9\u7bc7\u662f**\u88ab\u52a8\u6a21\u5f0f**\uff1a\u8bbe\u5907\u4e3b\u52a8\u53d1\u5e27\uff0cHMI \u63a5\u6536\u5e76\u5e94\u7b54\u3002\n\n## 1. API\n\n\u51fd\u6570\u8bf4\u660euart_setup(ch, baudrate, databits, stopbit, parity)\u4e32\u53e3\u53c2\u6570\u521d\u59cb\u5316\uff1ach 0=\u4e3b\u4e32\u53e3\/1=\u526f\u4e32\u53e3\uff08\u526f\u4e32\u53e3\u5fc5\u987b setup\uff0c\u5426\u5219\u5173\u95ed\uff09\uff1bdatabits 8\uff1bstopbit 1 \u6216 2\uff1bparity 0=\u65e0\/1=\u5947\/2=\u5076\u3002\u4e3b\u4e32\u53e3\u53ea\u7528\u6b64\u51fd\u6570\u914d\u6570\u636e\u4f4d\uff0c\u6ce2\u7279\u7387\u5728\u5de5\u7a0b\u5c5e\u6027\u91cc\u8bbeon_uart_recv(ch, packet)\u4e32\u53e3\u63a5\u6536\u56de\u8c03\uff1apacket \u4e3a\u4e0b\u6807\u4ece 1 \u7684\u5b57\u8282\u8868\u3002\u53ef\u80fd\u5206\u5305\/\u7c98\u5305\uff0c\u5fc5\u987b\u81ea\u884c\u7f13\u51b2\u89e3\u6790uart_send(ch, packet)\u53d1\u9001\u5b57\u8282\u8868set_free_protocol(en)1=\u4ea4\u811a\u672c\u63a5\u7ba1\u4e3b\u4e32\u53e3\uff0c0=\u6062\u590d\u5de5\u7a0b\u534f\u8bae\n\n![\u81ea\u7531\u4e32\u53e3](https:\/\/www.modbus.cn\/wp-content\/uploads\/2026\/08\/visualhmi\/lu017_1.png)\n\n## 2. \u63a5\u6536\u5904\u7406\u7684\u73b0\u5b9e\uff1a\u5206\u5305\u4e0e\u7c98\u5305\n\non_uart_recv \u6536\u5230\u7684**\u4e0d\u4fdd\u8bc1\u662f\u4e00\u5e27\u5b8c\u6574\u534f\u8bae\u6570\u636e**\uff1a\u53ef\u80fd\u662f\u534a\u5e27\uff08\u5206\u5305\uff09\u3001\u53ef\u80fd\u591a\u5e27\u62fc\u4e00\u8d77\uff08\u7c98\u5305\uff09\u3002\u5fc5\u987b\u81ea\u5df1\u7ef4\u62a4\u63a5\u6536\u7f13\u51b2 + \u5e27\u89e3\u6790\u72b6\u6001\u673a\uff1a\u5e27\u5934\u8bc6\u522b\u3001\u957f\u5ea6\u6821\u9a8c\u3001CRC \u9a8c\u8bc1\u3001\u6570\u636e\u63d0\u53d6\u3002\n\n\u53e6\u5916\uff1a\u56de\u8c03\u5728**\u7cfb\u7edf\u4efb\u52a1\u8f6e\u8be2**\u4e2d\u6267\u884c\uff0c\u4e0d\u662f\u4e2d\u65ad\uff0c\u522b\u505a\u8017\u65f6\u64cd\u4f5c\uff1bDCBUS\/XGUS \u4e32\u53e3\u53c2\u6570\u56fa\u5b9a 1 \u4f4d\u505c\u6b62\u4f4d\u3001\u65e0\u6821\u9a8c\u3002\n\n## 3. \u6848\u4f8b\uff1aLED \u706f\u63a7\u534f\u8bae\n\n**\u5e27\u683c\u5f0f**\uff1a\u5e27\u5934 1B + \u957f\u5ea6 1B + \u529f\u80fd\u7801 2B + \u6570\u636e nB + \u5e27\u5c3e 2B\u3002\n\n\u65b9\u5411\u5e27\u5934\u5e27\u5c3e\u8bbe\u5907\u2192\u5c4f0x5A0xFC 0xFF\u5c4f\u2192\u8bbe\u59070xA90xFC 0xFF\n\n\u957f\u5ea6\u5b57\u6bb5 = \u529f\u80fd\u7801 2 + \u6570\u636e n + \u5e27\u5c3e 2 = n+4\uff0c\u5927\u7aef\u3002\u529f\u80fd\u7801\uff1a0x0001 \u5f00\u5173\u30010x0002 \u4eae\u5ea6\u30010x0003 \u6539\u540d\u79f0\u3002\n\n![LED\u706f\u63a7](https:\/\/www.modbus.cn\/wp-content\/uploads\/2026\/08\/visualhmi\/lu017_2.png)\n\n## 4. LUA \u5b9e\u73b0\uff08FSM \u72b6\u6001\u673a\uff09\n\n```\nlocal rxBuf = {}\n\nfunction on_init()\n  uart_setup(0, 0, 8, 1, 0)   -- \u4e3b\u4e32\u53e3: 8\u4f4d\u6570\u636e1\u505c\u6b62\u4f4d\u65e0\u6821\u9a8c\n  set_free_protocol(1)        -- \u4ea4\u811a\u672c\u63a5\u7ba1\nend\n\nfunction on_uart_recv(ch, packet)\n  for i = 1, #packet do\n    table.insert(rxBuf, packet[i])\n  end\n  parse_rx()\nend\n\nfunction parse_rx()\n  -- \u627e\u5e27\u5934 0x5A\n  while #rxBuf &gt;= 3 do\n    if rxBuf[1] == 0x5A then\n      local len = rxBuf[2]          -- \u957f\u5ea6 = n+4\n      if #rxBuf &gt;= len + 1 then     -- \u5e27\u5934+\u957f\u5ea6+len\n        -- \u6821\u9a8c\u5e27\u5c3e\n        if rxBuf[len+1] == 0xFC and rxBuf[len+2] == 0xFF then\n          local func = rxBuf[3]*256 + rxBuf[4]\n          handle_cmd(func, rxBuf)\n          -- \u79fb\u9664\u5df2\u5904\u7406\u5e27\n          for i = 1, len+2 do table.remove(rxBuf, 1) end\n        else\n          table.remove(rxBuf, 1)    -- \u5e27\u5c3e\u4e0d\u5bf9, \u4e22\u5f03\u5e27\u5934\n        end\n      else\n        break   -- \u7b49\u66f4\u591a\u6570\u636e\n      end\n    else\n      table.remove(rxBuf, 1)        -- \u4e0d\u662f\u5e27\u5934, \u4e22\u5f03\n    end\n  end\nend\n\nfunction handle_cmd(func, buf)\n  if func == 0x0001 then            -- \u5f00\u5173\n    set_uint16(VT_LW, 0x1000, buf[5])\n  elseif func == 0x0002 then        -- \u4eae\u5ea6\n    set_uint16(VT_LW, 0x1001, buf[5])\n  elseif func == 0x0003 then        -- \u6539\u540d\u79f0\n    -- buf[5] \u8d77\u662f\u540d\u79f0\u5b57\u8282\n  end\n  -- \u5e94\u7b54\n  local resp = {0xA9, 0x04, 0x00, 0x01, 0xFC, 0xFF}\n  uart_send(0, resp)\nend\n```\n\n\u88ab\u52a8\u534f\u8bae\u6700\u5751\u7684\u662f**\u5206\u5305\u7c98\u5305**\uff1a\u5fc5\u987b\u505a\u7f13\u51b2 + \u72b6\u6001\u673a\u89e3\u6790\uff0c\u522b\u5047\u8bbe\u4e00\u6b21\u56de\u8c03\u5c31\u662f\u4e00\u5e27\u3002\u5e27\u5934\u540c\u6b65\u7528 while \u5faa\u73af\u9010\u5b57\u8282\u4e22\u5f03\u975e\u5e27\u5934\u6570\u636e\uff0c\u957f\u5ea6\u5b57\u6bb5\u5224\u5b8c\u6574\u5e27\u3002\n\n\u6574\u7406\u81ea \u5e7f\u5dde\u5927\u5f69\u79d1\u6280 VisualHMI \u5f00\u53d1\u6587\u6863\uff08hmi-doc.gz-dc.com\uff09LUA \u6559\u7a0b\u300c\u81ea\u7531\u4e32\u53e3\u534f\u8bae\uff08\u88ab\u52a8\uff09\u300d\uff0c\u7248\u6743\u5f52\u5927\u5f69\u79d1\u6280\u6240\u6709\u3002\n\n---\n*modbus.cn*\n"