我的总体计划目标是使用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没数据了。
答案 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到目前为止提供的所有帮助。