2016-11-24 11 views
3

Я использую Rebol3 v3.0.99.4.20, который имеет как/View, так и серийную функциональность.Чтение последовательного порта в Rebol3

Я открываю порт с:

ser: open serial://ttyUSB0/9600 

Затем я создал мой асинхронный обработчик:

ser/awake: func [event /local p][ 
    p: event/port 
    switch event/type [ 
     lookup [open p] 
     connect [write p to-binary request] 
     read [ 
      result: to-string p/data 
      close p 
      return true 
     ] 
     wrote [read event/port] 
    ] 
    false 
] 

Проблема у меня есть сейчас, что я не могу понять, как читать данные из последовательный порт. Я всегда возвращаю последнюю команду, которую я написал в последовательный порт в ser/data.

Например:

>> ser: open serial://ttyUSB0/9600 
>> write ser "debug on^/" 
>> read ser 
== "debug on^/" 

Это выглядит нормально до сих пор, но это, как последовательное устройство работает с помощью команды Linux, 'экран':

Мой вход:

debug on 

Ответ последовательного устройства:

Debug messages enabled. 
> 

Однако я никогда не могу прочитать сообщение «Отладочные сообщения». текст.

>> read ser 
== "debug on^/" 

>> wait ser 
== none 

>> read ser 
== "debug on^/" 

>> copy ser/data  
== "debug on^/" 

Не уверен, что мне не хватает.

В Rebol2, это гораздо проще, но не асинхронный:

>> system/ports/serial 
== [com1 com2 com4] 
>> ser: open/no-wait serial://port3/9600/8/none/1 
>> insert ser "debug on^/" 
>> copy ser 
== "debug on^/Debug messages enabled.^/>" 
>> copy ser 
== "" 

2-ая копия не возвращает ничего, потому что первая копия очищается серийный буфер. Если данные транслировались на последовательный порт, дополнительные команды копирования возвращают дополнительные данные из последовательного буфера. Но в Rebol3 это не работает.

ответ

2

Найдено эту информацию в архивах чат-группы:

ser: open serial://ttyUSB0/9600 
written: false 
ser/awake: func [evt][ 
    switch evt/type [ 
    read [ 
     attempt [print to-string evt/port/data] 
     read evt/port 
     return true 
    ] 
    wrote [ 
     written: true 
     return true 
    ] 
    ] 
    false 
] 
write ser "debug on^/" 
while [not written][ 
    wait [ser 1] 
] 
read ser 
wait [ser 1] 
0

Петля событие вы указали в своем вопросе на самом деле следует читать данные для вас. Если вы хотите продолжать чтение данных, вам не следует выходить из цикла с return true, но делать еще одно чтение в прочитанном событии. Вы должны обрабатывать данные внутри цикла событий.

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

  • Нет связанных вопросов^_^