Чтение и запись в последовательный порт с Lua на Windows - PullRequest
0 голосов
/ 09 февраля 2019

Моя общая цель программы - создать лучший графический интерфейс для калибровки 3D-принтера с использованием Lua, и, к счастью, часть GUI уже работает.Я пытаюсь читать и записывать в COM-порт моего компьютера с Windows 10 на Arduino принтера.Тем не менее, я озадачен последовательной связью.В настоящее время у меня есть два кабеля FTDI, соединенных вместе, и я могу связываться между ними с помощью RealTerm (терминальной программы) для тестирования, поэтому я знаю, что проводка правильная.Я использую ZeroBrane Studio для разработки, но мне пока не удобно устанавливать библиотеки.

До сих пор я пробовал следующие решения:

1) Попытка: внедрить сценарий powershell для открытия последовательного порта

Результат: нетданные выходят из порта, но ошибки не генерируются

2) Попытка: использовать srdgame / librs232 library

Результат: требуется код «rs232» в коде не выполняетсяне могу найти файл.Я установил содержимое SRC в ту же директорию, что и мой код Lua, однако, вероятно, это неправильный способ сделать это.

3) Попытка: использовать встроенную функцию io в Lua Результат: я смоготправлять данные с помощью этого метода, что является отличной новостью.Однако я не вижу способа отрегулировать скорость передачи данных порта.Заход в диспетчер устройств и гадость с настройками не дали эффекта.По умолчанию используется значение 115200.

Код:

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

Другие параметры: Я установил luarocks, но не могу установить какие-либо библиотеки в командной строке.«Ошибка: не удалось найти ожидаемый файл ffi.lib, или ffi.dll, или libffi.dll для FFI - возможно, вам придется установить FFI в вашей системе и / или установить переменную FFI_DIR»

Если естьРешения требуют библиотек, я хотел бы получить некоторые рекомендации о том, какие файлы идут куда.

Заранее спасибо!

PS: Вот еще несколько ссылок, которые я исследовал.

3) posix , похоже, только для linux

4) lua-user.org Serial Communication wiki .Я не понял инструкции и их рекомендуемая библиотека не содержит данных ..

1 Ответ

0 голосов
/ 11 февраля 2019

Первое работоспособное решение, которое у меня есть, - это использование сценария 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, могут содержать пробелы.К сожалению, все они разделяются терминалом на несколько аргументов, поэтому powershell отправляет их и объединяет в одну строку.Во-вторых, порт должен быть открыт для чтения или записи данных.Если какие-либо последовательные данные отправляются до того, как они открыты, эти данные теряются.

Оставшаяся проблема: Я не могу оставить порт открытым, тогда делайте что-то в Lua и периодически проверяйте портдля новых данных.Это прискорбно, потому что аппаратное обеспечение, которое я использую, иногда отправляет данные без запроса или занимает много времени, чтобы ответить всеми данными (в случае итеративной калибровки уровня).Кроме того, каждый раз, когда я открываю порт, аппаратное обеспечение перезагружается.На данный момент у меня нет хорошего решения.

Вот моя попытка исправить: создать три отдельных скрипта powershell # 1) открыть порт # 2) прочитать порт и вернуть nil в течение 500 мс, если данных не существуетв противном случае ответьте со всеми данными и # 3) закройте его.К сожалению, # 2 выдает ошибку о закрытии порта даже после запуска # 1.Я хотел бы услышать некоторые мысли, и с удовольствием обновлю этот ответ с любыми решениями.

Большое спасибо Егору за всю помощь.

...