2015-02-24 4 views
1

Существует ли конкретный подход к чтению файлов устройств в CL? Я стараюсь следующий код в SBCL, но он не появляется на работе:Чтение из файлов устройств

(defparameter modem #p"/dev/ttyUSB2") 
(defun read-modem() 
    (with-open-file (fd modem :direction :io :if-exists :append) 
      (loop while (peek-char nil fd) do 
      (format t "~A" (read-line fd)) 
      (finish-output fd)))) 

Я знаю, что есть выход, потому что cat /dev/ttyUSB2 показывает его.

+3

можете ли вы читать символы вместо строк? –

+0

Работает чтение символов. Теперь имеет смысл, read-line возвращается только тогда, когда встречается # \ newline или конец файла. – automaton

+0

Обратите внимание, что NEWLINE может означать CR, CRLF (два символа!) Или LF - в зависимости от Lisp, конфигурации и платформы Lisp. –

ответ

2

Думаю, вам нужно прочитать их как из двоичных файлов. Например, вот что я прочитал от /dev/urandom:

> (with-open-file (fd "/dev/urandom" :direction :io :if-exists :append 
         :element-type 'unsigned-byte) 
    (read-byte fd)) 
161 
2

Я думаю, ваша проблема с буферизацией. Я не думаю, что вы можете отключить его в CL open, поэтому я боюсь, что вам нужно будет использовать sb-unix:unix-open и sb-unix:unix-read.

Смежные вопросы