在Windows上使用Lua读写串行端口

时间:2019-02-09 06:33:01

标签: windows lua serial-port port communication

我的总体计划目标是使用Lua创建更好的3D打印机校准GUI,很幸运,我的GUI部分已经在工作。我正在尝试读写Windows 10计算机上的COM端口到打印机的Arduino。但是,我对串行通信感到困惑。目前,我有两根FTDI电缆连接在一起,并且可以使用RealTerm(终端程序)在它们之间进行通信以进行测试,因此我知道接线正确。我正在使用ZeroBrane Studio进行开发,但尚不满意安装库。

到目前为止,我已经尝试了以下解决方案:

1)尝试:嵌入powershell script to open the serial port

结果:端口没有数据出来,但是没有错误发生

2)尝试:使用srdgame/librs232 library

结果:由于找不到文件,因此require“ rs232”在代码中失败。我将SRC的内容与Lua代码安装在同一目录中,但是可能不是正确的方法。

3)尝试:在Lua中使用本机io函数 结果:我能够使用此方法发送数据,这是个好消息。但是,我看不到调整端口波特率的方法。进入设备管理器并修改设置无效。默认值为115200。

代码:

file=io.open("COM5","w")
io.output(file)
io.write("Hello world")

其他选项: 我已经安装了luarocks,但无法在Command Prompt中安装它。 “错误:找不到用于FFI的预期文件ffi.lib,ffi.dll或libffi.dll,您可能必须在系统中安装FFI和/或设置FFI_DIR变量”

如果任何解决方案都需要库,那​​么我希望获得有关将文件放置在何处的一些指导。

提前谢谢!

PS:这是我调查过的其他参考资料。

3)posix似乎仅适用于Linux

4)lua-user.org Serial Communication wiki。我不理解说明,他们的recommended library没数据了。

1 个答案:

答案 0 :(得分:0)

我第一个可行的解决方案是使用Powershell脚本。它从Lua接收参数,包括COM端口,波特率和要写入的字符串。

首先,这里是Lua脚本。

writeThenReadCOMinLua.lua

local comPort = "COM2"
local baud = "9600"
local dataToWrite = "Hello. Is Anyone There?"
--run the powershell script with supplied params. Spaces are important.
local file = io.popen("powershell.exe -file ./liblocal/psLibs/writeAndReadCOM.ps1 
"..comPort.. " " .. baud .. " " .. dataToWrite)

--Wait for a reply (indefinitely)
local rslt = file:read("*a")
print("Response: " .. rslt)

然后,编写Powershell脚本,然后等待答复。

writeAndReadCOM.ps1

$nargs = $args.Count #args is the list of input arguments
$comPortName=$args[0] #This is the com port. It has zero spaces
$baud = $args[1] #this is the numberical baud rate
#the remainder of the arguments are processed below


#Combine argument 2,3,...,n with a space because of command prompt shortfalls to pass arguments with spaces
$dataToWrite = ""
For ($i=2; $i -le $nargs ; $i++) {
    $dataToWrite = "$($dataToWrite) $($args[$i])"
}

#$port= new-Object System.IO.Ports.SerialPort COM2,9600,None,8,one
$port= new-Object System.IO.Ports.SerialPort $comPortName,$baud,None,8,one

#open port if it's not yet open
IF ($port.IsOpen) {
    #already open
} ELSE {
    #open port
    $port.Open()
}

#write the data
$port.WriteLine($dataToWrite)

#wait for a response (must end in newline). This removes the need to have a hard coded delay
$line = $port.ReadLine()
Write-Host $line #send read data out

#if the response was multiple lines, then read the rest of the buffer. If the port was just opened.
while ($port.BytesToRead -ne 0) {
    $dataReturned = 1
    $line = $port.ReadLine()
    Write-Host $line #send read data out for the remainder of the buffer
}

$port.Close()

#IF ($dataReturned -eq 0) {'PS_NO_BYTES_TO_READ'}

这里发生了一些事情。 首先,lua发送的串行数据可能有空格。不幸的是,这些都被终端分离为多个arg,因此powershell然后将它们重新组合为一个字符串。 其次,必须打开端口才能读取或写入数据。如果在打开之前发送了任何串行数据,该数据将丢失。

剩余问题:我无法打开端口,然后去做Lua的工作并定期检查端口是否有新数据。这是不幸的,因为我使用的硬件有时会在没有请求的情况下发送数据,或者花费很长时间来答复所有数据(在迭代级别校准的情况下)。此外,每次打开端口时,硬件都会重新启动。目前,我还没有很好的解决方案。

这是我的修复尝试:创建三个单独的Powershell脚本#1)打开端口#2)读取端口,如果不存在数据,则在500mS内返回nil,否则用所有数据答复并#3)关闭它。不幸的是,即使运行#1,#2也会引发有关端口关闭的错误。我希望听到一些想法,并很乐意通过任何解决方案来更新此答案。

非常感谢Egor到目前为止提供的所有帮助。