Snusmumriken
Кстати, домашнее задание - узнать что такое flush.
RE
блин.. вроде подробно все написал..
RE
флаш это сброс буфера чтения
RE
я тоже озадачивался нафиг он нужен
но во всех примерах его используют
RE
он конектится через Serial к ардуине
Snusmumriken
Вот. Я не был уверен что ты не влепил скрипт на ардуину, я так уже делал.
От этого зависит то, какие библиотеки связи используются.
Твой ответ по flush - неправильный, ищи информацию лучше и проверяй её.
Там совершенно конкретное действие, причём регулярно необходимое, особенно в байтоковырянии.
RE
а ардуина подключена через USB адаптер грубо говоря
RE
а ну да
на nodemcu вроде тоже есть луа, но это не мой случай
Snusmumriken
И там чуть другие библиотеки, которые только выглядят похоже, но внутри сильно разные.
RE
ну я искал и нашел только то, что он обнуляет какойто буфер чтения.
RE
хм
а тут
http://www.lua.ru/doc/5.7.html
написано, что сохраняет данные в какойто файл
Snusmumriken
Хех, напротив, он очищает буфер записи.
Если ты делаешь много-много очень мелких записей в тот же serial port, это ведёт к куче переключений контекста и повышенной нагрузке на порт, особенно если он не работает в дуплексе, поэтому там часто есть буферы, в которых хранится "то что ты посылал в порт за последние N секунд".
Flush - принудительная отправка всего содержимого буфера и очистка его.
RE
кстати да - чтото с доками там не оч понятно написано..
какието отсылки к другим методам
RE
мм... прочитал перевариваю
RE
у меня так сделано:
chain=rserial:read();
rserial:flush()
я полагал, что результат чтения сразу сохраняется в chain
но учитывая описания flush - он еще сохраняется в rserial чтоли после команды rserial:flush()?
Snusmumriken
Нет, он никуда не сохраняется, эта команда тут бесполезна, она ничего не делает.
RE
сча проверим)
RE
тру
RE
закоментил ее и все сработало как раньше
спасибо
Snusmumriken
Вот такой вариант:
rserial:write('123');
rserial:write('456');
rserial:write('789');
rserial:flush();
Отправляет всё содержимое буфера который ты раньше записал: "123\0456\0789\0"
А мелкие записи отправляются в буфер.
RE
что такое \0 ?
Snusmumriken
Ох. Ты точно на микроконтроллеры пишешь? : )
RE
ну ардуино же)
RE
всмысле - это не супер пупер ембидед
Snusmumriken
Ну там типа сишка.
Вот смотри, сколько байт тебе надо выделить под текст "qwerty123"?
RE
каждый чар вроде == байт
RE
?
Snusmumriken
Почти. На один больше, как раз для '\0'.
RE
хм
RE
\0 - тут два чара, а не один, не?
\
и
0
Snusmumriken
Карочи, это - символ-терминатор.
RE
стоп байт?
RE
ну лан. допустим это некий разделитель. чтобы все в одну строну не лепилось. мне это вроде пока не важно при чтении.
Snusmumriken
Обозначает конец строки.
Нет, это один байт, потому что он подменяется строковым препроцессором на байт "00000000".
Так же как комбинация символов "\n" подменяется на "00001100" (12 в десятичке)
Snusmumriken
RE
я прост не пойму - почему так сделано - что пока нет ентера в выводе - read() не работает
RE
хм.. вот похоже в моем выводе нету этого конца строки.
Snusmumriken
Карочи, символы до 32 - это "непечатные специальные символы", и чтобы их вывести, используются всякие ухищрения типа "\0".
Для того чтобы не печатать "\10"-"\15" вместо символа перехода строки, под них сделаны буквенные сокращения: "\n"-"\r"
Snusmumriken
Ну, \n означает 'Newline', переход на следующую строку,
а \r - 'carriage Return', возврат каретки. Это осталось ещё с очень древних принтеров.
Snusmumriken
RE
итак
\0 это конец строки
в байт представлении - 0000 0000
но где он в таблице?
для 0 там Null стоит - это точно не конец строки
Snusmumriken
Это как раз оно : )
RE
ой
NUL
он же != NULL
RE
оке
я когдато это все читал конечно, просто не применял так плотно. спасибо за ликбез
Snusmumriken
> он же != NULL
Ох, расслабься, ты сейчас фигнёй немножко страдаешь, как правило, это схожие вещи или одно и то же.
Тут просто не написано что это ещё и терминатор (2).
RE
CR LF еще там в паскале какомто сто лет назад..
RE
ну ок
RE
примерно понятно.
Snusmumriken
Вычищай кашу в голове.
Почитай всяких K&R.
RE
почитай их, потом найти сорцы луа
посмотри как read реализован и не задавай глупых вопросов
яснопонятно)
Snusmumriken
Итак, что ты хочешь?
RE
счас проверю твой код что выше
Snusmumriken
RE
биндинг на сишку - другими словами плиз?
RE
С - понятно
RE
биндинг тоже
но не все вместе
Snusmumriken
Ну типа, знаешь что такое lua-функция?
Snusmumriken
Ох, пардон.
RE
хм.. код в модуле. который можно вызвать из своего кода
Snusmumriken
Карочи, биндинг - это связка между сишкой и луа.
Считай что луа-функция, которая ничего не делает кроме вызова соответствующей сишной функции.
RE
а откуда она берет сишную?
RE
там в системе гдето либа лежит?
RE
и оно както залинковано
Snusmumriken
Хмм.
Допустим, ты хочешь сделать возможность из Lua в венде делать MsgBox'ы. Типа окошек со всплывающим сообщением.
Так как луа сама по себе не может такого, ей нужно некоторое расширение на сишке.
Например, что-то такое:
#include <windows.h> /* для месседжбоксов, это кусок операционки */
#include "lauxlib.h" /* подрубаем луа чтобы выгружать в неё сишные функции*/
/* Пилим сишную функцию */
int lua_msgbox(lua_State* L)
{
/* чтение данных из луа - вот такими командами, типа, читаем аргументы переданные в функцию */
const char* message = luaL_checkstring(L, 1);
const char* caption = luaL_optstring(L, 2, "");
/* биндинг (связка) луа функции с сишкой, вызов MsgBox с данными принятыми от луа */
int result = MessageBox(NULL, message, caption, MB_OK);
lua_pushnumber(L, result);
return 1;
}
/* регистрируем в луа только что написанную функцию как луа-функцию с именем 'msgbox' */
int __declspec(dllexport) libmsgbox (lua_State* L)
{
lua_register(L, "msgbox", lua_msgbox);
return 0;
}
И всё. Компилим dll-библиотеку 'libmsgbox', подрубаем к луа:
require('libmsgbox')
msgbox('Хаю-хай')
-- на этом моменте, выскакивает окошко с сообщенькой,
-- мы расширили функционал луа через сишный биндинг к операционной системе
Snusmumriken
Но всё что скрыто за сишной функцией венды "MessageBox" - надо копать в windows.h, потому что эта функция оттуда.
RE
значит такое поведение при чтении из сериал из-за того, что в сишной либе так реализовано..
Snusmumriken
Карочи, луа-функция может быть как написана на луа, так и на сишке, и просто выгружена в луа.
Луашный io.read - такой же биндинг к аналогичной стандартной сишной функции.
Всё содержимое io.read зависит от внутренностей твоей оси.
RE
значит вот почему они советовали другие либы использовать..
RE
гораздо понятней стало. спасибо
RE
RE
у меня так чет не работает..
RE
chain=rserial:read(0);
RE
The read function reads strings from the current input file. Its arguments control what is read:
"*all" reads the whole file
"*line" reads the next line
"*number" reads a number
num reads a string with up to num characters
RE
разве num может быть 0
Snusmumriken
Вот эти твои serial - нестандартные библиотеки для луа, и ОБЫЧНО, во всяких чтениях указывается или количество байт которые надо считать, или таймаут на чтение.
Видимо, тут у тебя это таймаут.
Snusmumriken
А, блин, меня глючит
Snusmumriken
Ты же через io.open открываешь. Тогда реализация стандартная.
RE
ок.. с 0 не пашет
а с 1 - пишет весь вывод по одному символу в строку
RE
типа так:
root@OpenWrt:/www/cgi-bin# ./cl2
2
>
>
>
s
e
n
d
i
n
g
r
e
q
u
e
s
t
4