Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
SEREGIUS
0 / 0 / 0
Регистрация: 18.02.2017
Сообщений: 8
1

Lua Socket TCP/IP скрипт зависает

23.03.2018, 16:53. Просмотров 292. Ответов 4

Использую чпу для резки лазером. Язык расширения у неё Lua. Соединение по Ethernet. Команды лазер принимает одной строкой в ascii символах.
Например:
"ABN" - включить пилот-лазер (если команда исполнена, то ответ "ABN")
"ABF" - включить пилот-лазер (если команда исполнена, то ответ "ABF")
если команда не исполнена, то ответ "BCMD".
Сделал модуль - IPGEthernet.lua
Код
local IPGEthernet = {}
local inst = mc.mcGetInstance()

package.path = package.path .. ";./Modules/?.lua;"
package.cpath = package.cpath .. ";./Modules/?.dll;"

rs232 = require("luars232")
socket = require("socket")

---------------------------------------------------------------
-- IPG -- Ethernet -- TCP/IP
---------------------------------------------------------------
function IPGEthernet.Ethernet(IP, message, len)
local port = 10001
local tcp = assert(socket.tcp())
local data
tcp:connect(IP, port)
tcp:send(message .. "\n")
data = tcp:receive(len)
tcp:close()
data = tostring(data)
	if data == message then
		wx.wxMessageBox("Команда "..message.." выполнена!")
	else
		wx.wxMessageBox("Команда "..message.." невыполнена!")
	end
--return data
end
--
return IPGEthernet
Сделал кнопку:
Код
local A, B, C
A = scr.GetProperty('txtIp', 'Value')
A = tostring(A)
--wx.wxMessageBox(A)

B = "ABN"
--wx.wxMessageBox(tostring(B))

C = string.len(B)
--wx.wxMessageBox(tostring(C))

IPGEthernet.Ethernet(A, B, C)
Скрипт работает. Проблема начинается когда ответ приходит разной длины. Например команда "STA" (прочитать статус устройства) может вернуться таким "STA: 4100" (32-bit word), может вернуться таким "STA: 4294967295", таким "STA: 1".
Т.е. я шлю "STA", ожидаю ответ "STA: 4294967295", data = tcp:receive(15), если он приходит таким то всё ок, если приходит "STA: 4100" то скрипт зависает.
Собственно, что тут можно сделать, что бы считывать строки любой длины, при этом не зная какой они длины будут?
ПС: Пробовал подключаться по ком порту, такой проблемы нет, считывает любую длину.
В Lua не силён, использовал примеры из интернета.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2018, 16:53
Ответы с готовыми решениями:

Поправить скрипт LUA
Здравствуйте! Уважаемые, возникла необходимость подправить скрипт в LUA, и...

Есть Lua скрипт но он не запускаеться а код не читаем
Здравствуйте есть lua скрипт помогите его раскодировать,он когда в блокноте или...

LUA + C++
Привет всем :) я чото не понимаю чо у меня выевляется ошибки luaavg.obj...

Установка Lua
Здравствуйте! Подскажите, пожалуйста как это сделать: Что бы вы могли...

lua script
Такое дело: Есть изображения, и есть скрипт на Lua, который эти изображения...

4
vantfiles
38 / 35 / 19
Регистрация: 07.05.2013
Сообщений: 133
23.03.2018, 17:41 2
tcp:receive( 15 ) -- откуда это в скрипте?
судя по виду ф-ции -- function IPGEthernet.Ethernet( IP, message, len )
len - это длина принятых данных
тогда и строка data = tcp:receive( len ) должна принимать сообщение любой длины без подвисаний

И с протоколом есть небольшая странность --
tcp:send(message .. "\n") -- здесь символ перевода строки посылается явно
data = tcp:receive(len) -- здесь конец посылки никак не обозначен
0
SEREGIUS
0 / 0 / 0
Регистрация: 18.02.2017
Сообщений: 8
23.03.2018, 20:46  [ТС] 3
Цитата Сообщение от vantfiles Посмотреть сообщение
tcp:receive( 15 ) -- откуда это в скрипте?
Это пример. Текстовых команд много, они разной длины. Скрипт в кнопке узнаёт длину и передаёт в модуль сколько считать байт в ответе.
Цитата Сообщение от vantfiles Посмотреть сообщение
len - это длина принятых данных
Это длина ожидаемых данных, сколько придёт не известно (тут то и проблема).
Цитата Сообщение от vantfiles Посмотреть сообщение
строка data = tcp:receive( len ) должна принимать сообщение любой длины без подвисаний
Должна или нет я не знаю. В примерах в гугле длина вообще не указывается и у всех работает. Единственное но, все подключаются к своему серверу, который могут подправить. Если я не указываю длину вообще, то скрип виснет намертво. Как только ставлю 1, то всё работает отлично, так же всё работает когда указываешь правильную длину ответа, как только ожидаемая длина больше ответа - то зависание, меньше - считывается просто не все данные.
Цитата Сообщение от vantfiles Посмотреть сообщение
символ перевода строки посылается явно
Да.
Цитата Сообщение от vantfiles Посмотреть сообщение
здесь конец посылки никак не обозначен
Если я не ошибаюсь, то это приём. В скобках кол-во считываемых байт.
Возможно я в корне не правильно делаю?
Как используя lua socket послать по Ethernet TCP строку и получить в ответ строку неопределённой длины?
0
vantfiles
38 / 35 / 19
Регистрация: 07.05.2013
Сообщений: 133
24.03.2018, 09:16 4
socket = require("socket") -- вы можете уточнить, какая именно это библиотека? возможно в ней есть возможность поставить калбэк на прием - тогда все было бы гораздо проще, говоря короче - необходимо в документацию на нее заглянуть.
0
SEREGIUS
0 / 0 / 0
Регистрация: 18.02.2017
Сообщений: 8
24.03.2018, 12:49  [ТС] 5
Начал было искать разные версии LuaSocket, но находились такие же, как и у меня. Начал было пробовать разные версии core.dll, пока не наткнулся на такой скрипт:
Код
socket = require("socket")
client = socket.connect("www.google.com",80)
client:send("GET / HTTP/1.1\n\n")
client:settimeout(1)
repeat
  print "read"
  line,err,rest = client:receive(512)
  print "read done"
  if line then print(line) end
  if rest then print(rest) end
until err

print "all done"
Он работает. Если длину указать не верно, то он входящее сообщение бьёт на части. Попробовал не указывать длину вообще - работает. Принимаются сообщения любой длины. Только settimeout() нужно выставить чуть больше времени гарантированного времени ответа устройства.
0
24.03.2018, 12:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2018, 12:49

Lua, Android
Доброго времени суток. Хочу попробовать себя а в разработке игр под Android...

*.lua in *.exe
Кто знает как скрипт на луа компилить в исполняемый файл, подскажите, хочу...

Учебник по Lua
Добрый день! Подскажите пожалуйста хороший учебник по Lua на русском или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru