Serial port Tcl fileevent读取以前发送的内容
我是一个新的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
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
,不要担心丢失一个字节;如果还剩下一个,您的回调将立即再次被调用以处理它