2013-03-18 37 views
0

我正在查詢舊的泰克11801B採樣示波器。當我查詢任何東西時,它總是返回我的結果,然後是一個設備上的「ÿ」或另一個設備上的「ÿ..」(同一型號)的無限串。所以,我決定在查詢之前,我會先閱讀所有內容,然後再打「ÿ」。如何在TCL中的字符串中檢測「ÿ」?

這裏有兩種方法我都試過:

# 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,變得無限大。但是,如果我一行一行地運行命令,希望一切正常。

+2

您是否想過使用'expect'與Tektronix交談?它應該是這種應用的理想選擇。 – 2013-03-18 16:15:53

+2

這通常是一個0xff,也許可以正確配置你的頻道(例如,用'fconfigure'設置一些翻譯/編碼。 – schlenk 2013-03-18 17:10:25

+0

@lanam我確實期待了一點,聽起來很好吃,但看起來不再支持並且windows版本在linux版本之前已經放棄了一段時間,所以我認爲它不是我們的應用程序的明智選擇。謝謝你的回覆,雖然 – Chrono 2013-03-18 18:08:52

回答

2

我相信問題是你如何來源文件。默認情況下,它使用encoding system,如果將文件保存爲UTF-8,則會出現問題。你可以看到Tcl如何看到char的ÿ;你可以試試下面的腳本:

binary scan ÿ c* bytes 
puts $bytes 

如果輸出不是-1,那麼這的確是這樣的。

避免這種情況的最好方法是使用\xff代替(編碼ASCII範圍之外的每個字符)。這是一個東西,我不只是推薦TCL,也爲像Java,C#許多其他語言等

所以,你有以下幾種選擇:

  • 使用\xff代替ÿ
  • 用系統編碼保存文件(在Tcl中用右編碼打開兩個文件& fcopy可以完成這項工作)
  • 使用正確的編碼源文件。如果使用tclsh調用,請使用tclsh -encoding utf-8 yourfile.tcl。如果使用source命令,然後source -encoding utf-8 yourfile.tcl

如果所有的這不起作用,你可以嘗試做輸入ÿ一個binary scan,看看它是什麼樣子。

+0

好吧,當我進行二進制掃描時,我得到了-1,但是當我掃描範圍正在發回的任何東西時,它給了我'66 121 116 101'。我將在哪裏使用\ xff,是編碼的輸入?另外,我不是從文件中讀取數據,如果這對您的答案有影響,我正在查詢一件設備。 – Chrono 2013-03-19 14:06:00

+0

它輸出'66 121 116 101'只是我的一個打字錯誤。 – Chrono 2013-03-19 14:16:31

+0

好吧,這個答案是有效的,如果你只是將設備輸出的每個字節掃描爲整數,然後尋找-1而不是ÿ,那麼腳本就可以工作,而且它也不會太笨重。感謝你的回答。 – Chrono 2013-03-19 14:25:02