Serial port Tcl fileevent读取以前发送的内容

Serial port Tcl fileevent读取以前发送的内容,serial-port,tcl,Serial Port,Tcl,我是一个新的tcl用户,最近一直在编写一个使用串口的脚本。到目前为止,我最大的问题是无法有效读取串行端口。 我正在使用fileevent进行读取,但它捕获以前发送的内容。但是,如果我之前没有发送任何内容,它将等待外部数据并捕获它。我的代码: global forever proc read_serial {serial} { set msg [read $serial] set listOfLetters [split $msg {} ] set serialIP

我是一个新的tcl用户,最近一直在编写一个使用串口的脚本。到目前为止,我最大的问题是无法有效读取串行端口。 我正在使用fileevent进行读取,但它捕获以前发送的内容。但是,如果我之前没有发送任何内容,它将等待外部数据并捕获它。我的代码:

    global forever

proc read_serial {serial} {

   set msg [read $serial] 
   set listOfLetters [split $msg {} ]
   set serialIPinHex ""

   foreach iChar $listOfLetters { ;#conversion to hex
      scan $iChar "%c" decimalValue
      set hexValue [format "%02X" $decimalValue ]
      set hexValue "0x$hexValue"
      set serialIPinHex "$serialIPinHex $hexValue"
      }
   puts "MCU RESPONSE:      $serialIPinHex"
   global forever
   set forever 1 ;# end event loop

}

set serial [open com1 r+]
fconfigure $serial -mode "19200,n,8,1"
fconfigure $serial -blocking 0 -buffering none
fconfigure $serial -translation binary -encoding binary
fileevent $serial readable [list read_serial $serial ]

global forever
puts -nonewline $serial \x31\xce
flush $serial
delay 10
vwait forever
flush $serial
close $serial

其效果是“MCU响应:x31 xce”,而它应该等待通过串行方式(据我所知)发送的消息。我确信另一端没有回音功能。提前感谢你的帮助。我希望我的bug不会让人难堪,我花了最后几个小时寻找它…

关于串行端口需要注意的主要问题是它们的速度很慢。真慢。一台现代计算机可以在一个串行端口通过一个字符之前(好吧,隐喻性地)在块上运行三次。这意味着你要让角色一个接一个地出现,你必须处理好这一点

建议您使用
read$serial 1
并将其附加到保留的缓冲区中,或者编写代码以一次处理一个字节。如果您使用的是面向行的消息传递,则可以利用
gets
在非阻塞模式下的良好行为(fblocked命令旨在支持此功能),但是
读取
并不十分友好(因为它对记录分隔符一无所知)

如果使用
read$serial 1
,不要担心丢失一个字节;如果还剩下一个,您的回调将立即再次被调用以处理它