LINUX.ORG.RU

Непонятки при программировании com порта

 , ,


0

2

Написал прогу для работы с устройством через com порт. (Язык: common lisp, реализация: sbcl 1.0.57). Устройство работает в режиме 9600 8N1, и шлет поток из 5 цифр, закодированных в ASCII и #\Return, потом снова 5 цифр итд.

Прога должна ловить цифры между #\Return, склеивать их в числа и обрабатывать. Т.е. входной поток такой:

(#\0 #\1 #\5 #\5 #\6 #\Return #\0 #\5 #\6 #\3 #\2 #\Return) итд, прога дает integer'ы 1556, 5632, ...

http://pastebin.com/1zYVNuYJ

Вот прога, я открываю устройство (setq stream (open-theremin)) и обрабатываю числа (calc-statistics stream)

Проблема в том, что последняя функция делает только 17 отсчетов и ждет чего-то, хотя данные на порт поступают без сбоев (это я с помощью терминала убедился).



Последнее исправление: vapor (всего исправлений: 1)

В целях профилактики говнокода рекомендую использовать хорошие языки, вроде C или Perl.

Minoru ★★★
()
Ответ на: комментарий от vapor

Можно, но там по крайней мере есть более-менее адекватное коммьюнити и какая-никакая стабильность. А лиспер с DSL - это как обезьяна с гранатой.

Minoru ★★★
()
Последнее исправление: Minoru (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Надо связать прогу на лиспе с устройством. Можно, конечно, на C написать, а потом через ffi, но смысл? Да и какая разница-то? Я просто, наверное, не так порт настроил. Какая разница на каком языке его настраивать ?!?!?!?!? (?!?!?!?!? означает, что я безмерно удивлен)

vapor
() автор топика
Ответ на: комментарий от vapor

Надо связать прогу на лиспе с устройством. Можно, конечно, на C написать, а потом через ffi, но смысл?

Советую попробовать.

Minoru ★★★
()
Ответ на: комментарий от Eddy_Em

Это не единственная, и самая небольшая проблема.

Minoru ★★★
()
Ответ на: комментарий от wota

Да ладно тебе. Я это давно писал. Теперь у меня все комментарии (кроме комментариев для gettext'а, естественно) на английском.

А глобальные переменные нужны — без них никуда.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

И да, учти, что 17 чисел с устройства оно ловит, а потом блокируется. При открытии я, кстати, не использую O_NDELAY, но по идее, и не надо. Отсутствие этого флага просто делает операцию чтения блокирующей, но данные на входе у меня есть, так что она не должна ждать долго.

vapor
() автор топика
Ответ на: комментарий от Eddy_Em

Каким образом? А эти ioctl только для линукса или нет? termios, это ж вроде на всех posix системах. У меня FreeBSD, если что (ждут типичных для этого форума комментов)

vapor
() автор топика
Ответ на: комментарий от wota

На лиспер ру наверное тоже можно, но тут раз железноспецифическое, то я подумал. что сюда лучше

vapor
() автор топика
Ответ на: комментарий от exception13

В мелкий буфер. Там 5 чисел и 1 return, вот и буфер - 6 символов. Ща попробую, кстати, в большой буфер прочитать

vapor
() автор топика
Ответ на: комментарий от exception13

Создал 1000 байтный буфер. Два раза зачитал в него. Первый раз зачитался:

(read-sequence *buf* *stream*)

1000

Второй раз заблокировался

vapor
() автор топика
Ответ на: комментарий от vapor

Каким образом?

Не получал данных.

эти ioctl только для линукса или нет?

Понятное дело, только для линукса. В мастдайке как — не знаю.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Зачем?

~$ cat 1.c 2.c 3.c
// 1.c
int x;
int x1() { return x; }

// 2.c
int x;
int x2() { return x; }

// 3.c
extern int x;
int x1();
int x2();

int main()
{
	x=3;
	printf( "x1: %d, x2: %d, x3: %d\n", x1(), x2(), x );
}
~$ gcc 1.c 2.c 3.c && ./a.out 
x1: 3, x2: 3, x3: 3
wota ★★
()
Ответ на: комментарий от exception13

Соответственно, в cflag сброшен CRTSCTS, в iflag - IXON, IXOFF, IXANY

vapor
() автор топика
Ответ на: комментарий от Eddy_Em

Ну, звиняй: я так не делаю, чтобы две одноименные глобальные переменные в разных файлах были.

учитывая, как ты активно пользуешься глобальными переменными, и как даешь им имена - тебе просто повезло, что ты еще не нарвался на баг, спорить не буду - пиши как хочешь

wota ★★
()
Ответ на: комментарий от exception13

Да, после того как прочитает несколько нормально.

Такое впечатление, что он дает мне содержимое внутреннего буфера, связанного с потоком, а новые данные туда не идут.

Хотя атрибуты я так устанавливаю: (sb-posix:tcsetattr fd sb-posix:TCSAFLUSH attrib)

Т.е. на момент, когда порт сконфигурирован, буферы должны быть сброшены. Кстати, нарыл тут милую библиотеку под python. Посмотрю, как там сделано.

vapor
() автор топика

поизучай strace-ом, что твоя программа творит на момент блокировки, какие системные вызовы дёргает и с какими аргументами

Harald ★★★★★
()
Ответ на: комментарий от mv

Не понял вопроса. Но о девайс на базе atmel mega8. Шлет примерно каждую 1/60 секунды 6-байтный отчет. В микроконтроллере 8-битный буфер (если ты об этом), отправляю побайтно.

Зы. Сделал на пистоне. Там делов-то: собрать статистику, а потом снимать отчет и отправлять OSC-сообщение на supercollider. Это я себе терменвокс спаял.

vapor
() автор топика
Ответ на: комментарий от vapor

Может быть очередной баг в streams у SBCL. Когда StumpWM на него портировали, крови много попортил.

Я в LispWorks только скорость и TCSANOW выставляю, всё работает без проблем.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.