我正在使用具有/ View和串行功能的Rebol3 v3.0.99.4.20。
我正在打开一个端口:
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
== ""
第二个副本不返回任何内容,因为第一个副本清除了串行缓冲区。如果数据流式传输到串行端口,则附加的“复制命令”将从串行缓冲区返回其他数据。但它在Rebol3中不起作用。
答案 0 :(得分: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]
答案 1 :(得分:0)
您在问题中提供的事件循环实际上应该为您读取数据。如果要继续读取数据,则不应使用返回true 退出循环,而是在read事件中执行另一次读取操作。您应该在事件循环中处理数据。