从 OpenWRT 中的串口读取 Lua 脚本

Posted

技术标签:

【中文标题】从 OpenWRT 中的串口读取 Lua 脚本【英文标题】:Lua script read from serial port in OpenWRT 【发布时间】:2018-03-19 18:07:49 【问题描述】:

我有通过 USB FTDI 适配器连接的带有 Arduino 的 Openwrt 路由器。 串口是/dev/ttyUSB0

Arduino 代码打印一些数据:

通过命令print()延迟打印的第一部分数据,例如:

Serial.begin(9600);
Serial.print(var1);
delay(1000);
Serial.print(var2);
delay(1000);
Serial.print(var3);
delay(1000);

第二部分用println() 命令打印:

Serial.println("");
Serial.println(var4);
Serial.println(var5);
Serial.println(var6);

因此,当我在终端中打开串行端口时,我可以看到如下内容:

1

然后在 1 秒后超时,然后

1 2

下一次超时。然后

1 2 3

上次超时和

1 2 3
4
5
6

它可以在终端程序和 OpenWRT 的控制台中使用,例如 screen /dev/ttyUSB0

我需要制作一个 Lua 脚本来读取串行端口并以相同的方式打印数据。我有一个简单的脚本,但它没有按预期工作。

rserial=io.open("/dev/ttyUSB0","r")
while true do
chain = nil
  while chain==nil do
    chain=rserial:read();
    print(chain)
  end
end

它一次显示所有数据。 它没有延迟显示前 3 个变量。 似乎是因为 rserial:read() - 它会读取直到收到换行符。 它在类似的问题中指出: How to read from a serial port in lua

我尝试按照那里的建议运行此命令:

stty -F /dev/ttyUSB0 -icanon

但这无济于事,我不明白为什么。 是否可以通过 stty 解决此问题? 或者我肯定需要为 Lua 脚本使用另一个串行库? 所有这些库现在似乎都已经过时了,我不想使用过时的东西..

【问题讨论】:

【参考方案1】:

来自Lua Reference Manual:

当不带格式调用时,它使用默认格式,读取 下一行(见下文)。

换行是缓冲区中的任何内容,直到下一个换行符。

只要你不发送换行符,Lua 就会等待一个,正如调用 read() 所告知的那样

收到换行符后,系统会提示您该行中的任何其他字符。

终端程序通常会更新每个字节以“实时”显示它们接收到的内容。

因此,如果您想获得相同的行为,则不能在没有任何参数的情况下使用 read()

使用read(1) 读取每个字节,无需等待其他任何内容。

【讨论】:

我也试过这个。当我使用我的 Lua 代码并将 rserial:read(); 更改为 rserial:read(1); 时,它会在一行中按一个符号打印我的 Arduino 输出。因此,如果 Arduino 打印“Hello”,Lua 脚本会打印:H e l l o 可能我需要检查换行符.. @TravErse 当然可以。每个print 呼叫都会开始一个新行。使用io.write 来避免这种情况。

以上是关于从 OpenWRT 中的串口读取 Lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Lua+luasocket笔记

如何读取剑侠三LUA 脚本插件 中的值 用C或VB

自己动手添加一个OpenWrt开机启动脚本

如何从OPENWRT固件上,用TFTP软件升级新版本OP

linux下shell脚本实现串口的读取以及报文的解析

使用 Python 串行库处理从串口读取的原始数据?