2016-11-24 70 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

你在你的問題中提供的事件循環其實應該讀出的數據爲您服務。如果你想繼續閱讀數據,你不應該退出循環返回true,但在閱讀事件做另一個讀取。你應該處理事件循環中的數據。