0

古い Tektronix 11801B サンプリング オシロスコープを照会しています。何かをクエリすると、常に結果が返され、あるデバイスでは「ÿ」、別のデバイスでは「ÿ..」の無限の文字列が返されます(両方とも同じモデル)。そのため、クエリを実行するときに「ÿ」を押す前に、すべてを読むことにしました。

私が試した2つの方法は次のとおりです。

# 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 を返し、無限になります。ただし、コマンドを1行ずつ実行すると、すべてが正常に機能します。

4

1 に答える 1

2

問題は、ファイルのソース方法にあると思います。これは、ファイルをUTF-8encoding systemとして保存する場合に問題になります。Tcl がcharをどのように認識するかを見ることができます。次のスクリプトを試すことができます。ÿ

binary scan ÿ c* bytes
puts $bytes

出力が でない場合-1、これは実際に当てはまります。

これを回避する最善の方法は、\xff代わりに使用することです (ASCII 範囲外のすべての文字をエンコードします)。これは、Tcl だけでなく、Java、C# などの他の多くの言語にもお勧めします。

したがって、次のオプションがあります。

  • \xff代わりに使用ÿ
  • ファイルをシステム エンコーディングで保存します (適切なエンコーディングを使用して Tcl で 2 つのファイルを開くと、fcopy でジョブを実行できます)。
  • 正しいエンコーディングでファイルをソースします。tclsh で呼び出す場合は、tclsh -encoding utf-8 yourfile.tcl. sourceコマンドを使用すると、source -encoding utf-8 yourfile.tcl

これらすべてが機能しない場合はbinary scan、入力に対してa を実行して、ÿそれがどのように見えるかを確認できます。

于 2013-03-19T12:15:03.873 に答える