You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何用Lua基础命令实现UART串口读写以连接传感器?

在Linux下仅用Lua基础命令实现串口读写

前提:配置串口参数

Linux串口默认的终端特性(如回显、规范模式)不适合传感器通信,必须先通过stty命令配置匹配的串口参数。在Lua中可通过os.execute调用该命令,示例配置波特率9600、8数据位、无校验、1停止位:

local serial_port = "/dev/ttyUSB0"
-- 按传感器实际参数调整波特率、流控等选项
local stty_cmd = string.format(
  "stty -F %s 9600 cs8 -cstopb -parenb -echo -icanon -crtscts",
  serial_port
)
local ok, exit_code = os.execute(stty_cmd)
if not ok then
  error(string.format("串口配置失败,退出码:%d", exit_code))
end

参数说明:

  • 9600: 替换为传感器要求的波特率
  • cs8: 8位数据位
  • -cstopb: 1位停止位(去掉减号为2位)
  • -parenb: 禁用奇偶校验(去掉减号为启用)
  • -echo: 禁用回显
  • -icanon: 禁用规范模式(立即读取输入,不等待换行)
  • -crtscts: 禁用硬件流控(传感器需要时可去掉减号)

方法1:纯Lua IO操作

直接用Lua的io.open以二进制模式打开串口,完成读写:

发送数据

local port = io.open(serial_port, "rb+") -- 读写二进制模式
if not port then
  error("无法打开串口:" .. serial_port)
end

-- 发送指定字节(示例:0x01、0x02、0x03)
local send_data = string.char(0x01, 0x02, 0x03)
port:write(send_data)
port:flush() -- 强制刷新缓冲区,确保数据发出

读取响应

串口读取默认阻塞,可按固定长度读取或读取所有可用数据:

-- 读取固定长度的响应(示例:读取5个字节)
local resp_length = 5
local response = port:read(resp_length)
if response then
  print("收到响应:")
  -- 以十六进制格式打印响应
  for i = 1, #response do
    io.write(string.format("%02X ", string.byte(response, i)))
  end
  print()
else
  print("未收到响应")
end

port:close()

方法2:结合Shell命令读写

若Lua IO操作遇到缓冲或阻塞问题,可通过Shell命令辅助:

发送数据

用echo -ne发送二进制数据:

-- 构造十六进制格式发送内容(示例:\x01\x02\x03)
local send_hex = "\\x01\\x02\\x03"
local send_cmd = string.format("echo -ne '%s' > %s", send_hex, serial_port)
os.execute(send_cmd)

读取响应

用timeout限制读取时长,避免永久阻塞,通过io.popen捕获输出:

-- 1秒内最多读取10个字节,丢弃错误输出
local read_cmd = string.format("timeout 1 dd if=%s bs=1 count=10 2>/dev/null", serial_port)
local handle = io.popen(read_cmd, "r")
local response = handle:read("*a")
handle:close()

if #response > 0 then
  print("收到响应:")
  for i = 1, #response do
    io.write(string.format("%02X ", string.byte(response, i)))
  end
  print()
else
  print("超时未收到响应")
end

注意事项

  • 串口权限:确保当前用户有权访问串口设备(通常需加入dialout组,或用chmod临时调整权限)
  • 参数匹配:必须严格对齐传感器的串口参数(波特率、数据位等),否则无法通信
  • 缓冲处理:Lua IO操作需调用flush()确保数据发送;Shell命令发送时用-n避免自动添加换行

内容的提问来源于stack exchange,提问作者cobdmg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:01:23