在Rebol3中读取串口

时间:2016-11-24 01:46:25

标签: serial-port rebol rebol3

我正在使用具有/ 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中不起作用。

2 个答案:

答案 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事件中执行另一次读取操作。您应该在事件循环中处理数据。