LINUX.ORG.RU

[Common Lisp] serve-event и read-sequence

 


0

0

Имеется функция, общающаяся с АЦП на последовательном порту.
 Она посылает болезному команду и ждёт от него ответа посредством serve-event.
Первоначально определена как-то так:

(defun write-adc-cmd-or-timeout (dev cmd &key (answer-size 8) (timeout 1))
  (let ((raw-data (make-array answer-size :element-type (stream-element-type dev))))
    (labels ((input-handler (dev) (read-sequence raw-data dev)))
      (sb-sys:with-fd-handler ((sb-posix::file-descriptor dev) :input #'input-handler)
	(write-sequence cmd dev)
	(if (sb-sys:serve-event timeout) raw-data nil)))))
 
Однако, изучив ругань, sbcl я понял, что ССЗБ. Т.к. with-fd-handler
 нужно скармливать дескриптор файловый (сиречь int), то он его и скармливает 
 input-handler'у.

Вопрос таков - есть ли в sbcl способ без лишнего геморроя превратить обратно fd в stream?
 
Пока нарыл в руководстве функцию sb-ext::make-fd-stream и   пытаюсь как-то так

(with-open-file (tty "/dev/ttyS0" :direction :io :if-exists :append
		     :element-type '(unsigned-byte 8))
		(let ((answ (make-array 8 :element-type (stream-element-type tty))))
		  (write-sequence #(128 16 16 16 16 16 16 16)
				  (sb-ext::make-fd-stream 
				   (sb-posix::file-descriptor tty)
				   :element-type '(unsigned-byte 8)))))

На что мне <<банка>> ругается - мол не бинарный поток, батеька.

Это или юбилей, или меня игнорят одни лисперы? (Пойду ещё ман <<банки>> покурю)

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

Конкретно я никогда с позиксом, ацп и хендлами не работал. Соответственно, и насписать было нечего.

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

Есть ещё IOlib http://www.cliki.net/IOlib - сборка биндингов к вызовам select и иже с ним для разных реализаций Common Lisp'а , но я не осилил сборку. А с serve-event и read-sequence работает, бо таймауты меньше секунды мне не нужны.

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