我正在查询旧的Tektronix 11801B采样示波器。当我查询任何内容时,它总是返回我的结果,然后在一个设备上返回无限字符串“ÿ”或在另一个设备上显示“ÿ..”(两个模型相同)。所以,我决定在查询时点击“ÿ”之前阅读所有内容。
我尝试了两种方法:
# Issue command
puts ${ChannelId} ${Command}
# Set loop variables
set Result [list]
set Byte [read ${ChannelId} 1]
set BadByte ÿ
# Loop until BadByte is found
while {![string equal -nocase ${Byte} ${BadByte}]} {
# Append good bytes to a list
lappend Result ${Byte}
# Read next byte
set Byte ::visa::read ${ChannelId} 1]
}
# Join and return result list
return [join ${Result}]
和
# Set loop variable
set Result [list]
# Read channel 1 byte at a time until ÿ is found
while {![string equal -nocase [set Character [read ${ChannelId} 1]] "ÿ"]} {
# Append non ÿ characters to a list
lappend Result ${Character}
}
# Join the result and return it
return [join ${Result}]
在这两种情况下,我的循环总是返回true并变为无限。但是,如果我逐行运行命令,希望一切正常。
答案 0 :(得分:2)
我认为问题在于如何来源文件。默认情况下,它使用encoding system
,如果您将文件另存为UTF-8,则会出现问题。你可以看到Tcl如何看到ÿ
char;您可以尝试以下脚本:
binary scan ÿ c* bytes
puts $bytes
如果输出不是-1
,那确实是这种情况。
避免这种情况的最佳方法是使用\xff
代替(编码ASCII范围之外的每个字符)。这是我不仅推荐用于Tcl,还推荐用于Java,C#等许多其他语言的东西。
所以你有以下选择:
\xff
代替ÿ
tclsh -encoding utf-8 yourfile.tcl
。如果您使用source
命令,则使用source -encoding utf-8 yourfile.tcl
如果所有这些都不起作用,您可以尝试在输入binary scan
上执行ÿ
,看看它是什么样的。