2016-11-24 7 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^/" 

これまでOKに見えますが、これはシリアルデバイスは、 '画面' を、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 
== "" 

最初のコピーはシリアルバッファをクリアするため、第二のコピーは何も返しません。データがシリアルポートにストリーミングされていた場合、追加のcopyコマンドはシリアルバッファから追加データを返します。しかし、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を返してループを終了しないでください。を読み込みイベントで別の読み込みを行います。イベントループ内でデータを処理する必要があります。

関連する問題