網(wǎng)口和串口通信有什么區(qū)別?各自支持的協(xié)議如何實現(xiàn)通信的?
網(wǎng)口和串口是兩種不同的物理通信方式,它們在通信協(xié)議、速度、距離、應(yīng)用場景等方面有顯著區(qū)別。
物理層差異
| 特性 | 串口 (UART/RS232/RS485) | 網(wǎng)口 (Ethernet) |
|---|---|---|
| 物理接口 | DB9、端子等 | RJ45 |
| 信號類型 | 電壓信號 | 差分信號 |
| 傳輸距離 | RS232: 15m, RS485: 1200m | 100m (無中繼) |
| 連接方式 | 點對點、總線式 | 星型拓?fù)?/td> |
| 傳輸速率 | 通常 ≤ 115.2kbps | 10Mbps - 100Gbps |
| 電氣隔離 | 可選 | 標(biāo)準(zhǔn)要求 |
協(xié)議棧對比
串口協(xié)議棧
應(yīng)用層協(xié)議 (Modbus RTU, 自定義協(xié)議等) ↓ 數(shù)據(jù)鏈路層 (簡單的幀結(jié)構(gòu)) ↓ 物理層 (UART → RS232/RS485)
網(wǎng)口協(xié)議棧
應(yīng)用層協(xié)議 (HTTP, MQTT, Modbus TCP等) ↓ 傳輸層 (TCP/UDP) ↓ 網(wǎng)絡(luò)層 (IP) ↓ 數(shù)據(jù)鏈路層 (以太網(wǎng)幀) ↓ 物理層 (以太網(wǎng)PHY)
協(xié)議實現(xiàn)方式
串口協(xié)議實現(xiàn)
1. Modbus RTU 實現(xiàn):
-- 在您的 data_send.lua 中function modbus_ask(channel, packet, uart_addr) -- 1. 解析Modbus RTU幀 local address, functionCode, startRegister, numRegisters, crc = parseQueryCommand(command) -- 2. 處理數(shù)據(jù)請求 local data = getDataFromDevice(startRegister, numRegisters) -- 3. 構(gòu)建響應(yīng)幀 local responseFrame = buildResponseFrame(address, functionCode, data) -- 4. 通過串口發(fā)送 uart_send(channel, responseFrame)end
2. 自定義ASCII協(xié)議:
function databuff_str_process(data) -- 添加起始位、結(jié)束位、校驗和 local startByte = string.char(2) -- STX local endByte = string.char(3) -- ETX local dataWithMarkers = startByte .. data .. endByte local checksum = calculateChecksum(dataWithMarkers) return dataWithMarkers .. string.char(checksum)end
網(wǎng)口協(xié)議實現(xiàn)
1. TCP Socket 通信基礎(chǔ):
-- 假設(shè)串口屏支持網(wǎng)絡(luò)功能function init_network() -- 初始化網(wǎng)絡(luò)連接 network_init() -- 創(chuàng)建TCP服務(wù)器 tcp_server = socket_create() socket_bind(tcp_server, "0.0.0.0", 502) -- Modbus TCP端口 socket_listen(tcp_server, 5)endfunction handle_tcp_connections() while true do local client = socket_accept(tcp_server) if client then -- 在新協(xié)程中處理客戶端 coroutine.create(function() process_tcp_client(client) end) end sleep(10) endend
2. Modbus TCP 實現(xiàn):
function process_tcp_client(client)
while true do
local data = socket_receive(client, 1024)
if not data then break end
-- Modbus TCP幀處理 (去掉了MBAP頭)
local modbus_data = string.sub(data, 7) -- 跳過6字節(jié)MBAP頭 + 1字節(jié)單元標(biāo)識
-- 使用現(xiàn)有的Modbus RTU處理邏輯
local response = modbus_ask(nil, modbus_data, unit_id)
if response then
-- 添加Modbus TCP MBAP頭
local mbap_header = {
0x00, 0x01, -- 事務(wù)標(biāo)識
0x00, 0x00, -- 協(xié)議標(biāo)識 (0=Modbus)
(#response + 1) >> 8, (#response + 1) & 0xFF, -- 長度
unit_id -- 單元標(biāo)識
}
local tcp_response = string.char(table.unpack(mbap_header)) .. string.char(table.unpack(response))
socket_send(client, tcp_response)
end
end
socket_close(client)end3. HTTP REST API 實現(xiàn):
function start_http_server()
local http_server = socket_create()
socket_bind(http_server, "0.0.0.0", 80)
socket_listen(http_server, 5)
while true do
local client = socket_accept(http_server)
if client then
coroutine.create(function()
handle_http_request(client)
end)
end
endendfunction handle_http_request(client)
local request = socket_receive(client, 1024)
local method, path = parse_http_request(request)
if method == "GET" and path == "/api/sensor/data" then
-- 返回JSON格式的傳感器數(shù)據(jù)
local json_data = buildMQTTData(edited_databuff)
local response = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n" .. json_data socket_send(client, response)
elseif method == "POST" and path == "/api/config" then
-- 處理配置更新
local body = extract_http_body(request)
local config = cjson.decode(body)
apply_config_changes(config)
local response = "HTTP/1.1 200 OK\r\n\r\n{\"status\":\"success\"}"
socket_send(client, response)
end
socket_close(client)end4. MQTT over TCP 實現(xiàn):
function mqtt_connect()
local mqtt_client = socket_create()
socket_connect(mqtt_client, "mqtt.broker.com", 1883)
-- MQTT連接報文
local connect_packet = build_mqtt_connect_packet()
socket_send(mqtt_client, connect_packet)
return mqtt_clientendfunction mqtt_publish_data(mqtt_client)
while true do
local json_data = buildMQTTData(edited_databuff)
local publish_packet = build_mqtt_publish_packet("sensors/data", json_data)
socket_send(mqtt_client, publish_packet)
sleep(5000) -- 5秒發(fā)布一次
endend通信協(xié)議對比表
| 協(xié)議類型 | 串口實現(xiàn) | 網(wǎng)口實現(xiàn) | 適用場景 |
|---|---|---|---|
| Modbus | Modbus RTU | Modbus TCP | 工業(yè)控制 |
| 自定義協(xié)議 | 起始位+數(shù)據(jù)+校驗 | TCP Socket | 專用系統(tǒng) |
| HTTP/REST | 不適用 | HTTP Server | Web配置 |
| MQTT | 通過串口轉(zhuǎn)發(fā) | 直接TCP | 物聯(lián)網(wǎng) |
| WebSocket | 不適用 | WebSocket | 實時數(shù)據(jù) |
