[問題] TCL 求教...

探討「內嵌」以及「腳本化」這兩個主題的技術-版主XO老師(熟悉的目前是 Tcl,討論內容也會環繞在 Tcl 四周,但是本版還是歡迎其他 Scripting 語言以及任何「內嵌」技術的討論。)

版主: b80203, ghost3401, XO, maa

分享到: Facebook

[問題] TCL 求教...

文章iamjack » 週六 4月 23, 2011 7:19 am

小弟目前為工程學位做最後的論文,
目前在弄一個用 control area network 的 sensor network...
經過個多月跟 datasheet 搏鬥...總算是有點成績....
早兩天終於終成功有 CAN message 在 network broadcast...
成功經 USB 引導到 Virtual COM port, 再由 Hyperterminal 顯示出來...

出來的是一串 16位元的 message
現在我要做的是將 message 有用的部份抽取出來,
再放上 GUI 上 display....
我本來打算用 Labview 來做 GUI 的
但是教授希望我用 TCL / Python / Perl 之類的腳本語言來做...
方便我走了, 其他人都會用....( 對我期望真高..我一定做得來嗎.. )

anyway... 我最後選了 TCL/TK ...
早兩天借了本 Practical Program in Tcl and TK...
看了半天.... 再上網左找找右找找... 便開始寫了... 一寫便寫到現在... ( 找早餐中 )
故事說完了... 現在來問題了...

當 message 走進 Hyperterminal 是這樣的

t110800F0000BC0000BC0

我想要的只是這3組數字....
t110800F0000BC0000BC0


我寫了一個簡單的 serial port datafetching process..
主要是開了 COM2 , 做好 SETTING, 不停拿我要的 3 組 16進位 數字..
第三個版本都沒有事,很成功地做到我想做的事...

代碼: 選擇全部
# this file will display the CAN message and  seperated ID Value 1& 2
proc Fetch {channel} {
   set port [gets $channel]
   puts  $port
 
   puts  -nonewline  "ID: "
    puts  -nonewline [ string range $port 1 3 ]

    puts  -nonewline  " Value1: "
    puts  -nonewline [ string range $port 9 10 ]

    puts  -nonewline  " Value2: "
    puts  -nonewline [ string range $port 15 16 ]

    puts ""   
}

set com [open com2: r+]
fconfigure $com -mode 9600,n,8,1 -blocking 0 -translation auto -buffering line
fileevent $com readable [list Fetch $com]


#GUI

pack [button .btn -text "STOP!! Kill Switch!!" -command {exit}] -expand 1 -fill both


那個是第三個版本的結果:
t100800708F8FC88E8CC4
ID: 100 Value1: 8F Value2: 8E
t110800F00007C00007C0
ID: 110 Value1: 00 Value2: 00

第四個版本我打算弄2個按鈕給人家選擇10進位 / 16進位....
就出事了....
我把按鈕拿了下來...因為不是問題主因....
問題主因是出在十六轉十進制,
我用的是以下2句, 而log3 , 的分別就是多了2句
set Value1 [expr 0x$Value1]
set Value2 [expr 0x$Value2]

代碼: 選擇全部
# log3  this file will display the CAN message and  seperated ID Value 1& 2
# log4  added hex to dex convertor

proc Fetch {channel} {
   set port [gets $channel]

   set ID [ string range $port 1 3 ]
   set Value1 [ string range $port 9 10 ]       
   set Value2 [ string range $port 15 16 ]   
      
   set Value1 [expr 0x$Value1]
   set Value2 [expr 0x$Value2]
   
   puts  $port

   puts  -nonewline  "ID: "
    puts  -nonewline $ID

    puts  -nonewline  " Value1: "
    puts  -nonewline $Value1

    puts  -nonewline  " Value2: "
    puts    $Value2   
}

set com [open com2: r+]
fconfigure $com -mode 9600,n,8,1 -blocking 0 -translation auto -buffering line
fileevent $com readable [list Fetch $com]


#GUI

pack [button .btn -text "STOP!! Kill Switch!!" -command {exit}] -expand 1


t110800F0000780000744
ID: 110 Value1: 0 Value2: 0
t10080070908E408C8B88
ID: 100 Value1: 144 Value2: 140

log4 表面上是成功的....log4 是可以把16進的2位轉回十進的3位...
問題出在不到3分鐘...就彈跳出了句
代碼: 選擇全部
Error : Invlid bareword "x"
in expression "0_@_x"
should be "$x" or "(x) or "x(...)" or ...

detail

invalid bareword "x"
in expression "0_@_x";
should be "$x" or "{x}" or "x(...)" or ...
invalid bareword "x"
in expression "0_@_x";
should be "$x" or "{x}" or "x(...)" or ...
    (parsing expression "0x")
    invoked from within
"expr 0x$Value1"
    (procedure "Fetch" line 8)
    invoked from within
"Fetch file33b7b40"


想問問 expr 為何給我 error >_<
根有沒有辦法解決
謝謝!
iamjack
剛學走路的小朋友
 
文章: 4
註冊時間: 週三 4月 13, 2011 1:01 am

Re:[問題] TCL 求教...

文章iamjack » 週六 4月 23, 2011 8:11 am

自問自答

error 的原因是因為 serial 讀 value 時... 有可能會不穩定....
引致字串出現 null 等情況...

解決方法...弄句 if statment... 肯定有數字才做 conversion...

代碼: 選擇全部
if { $Value1 > 0} {
   set Value1 [expr 0x$Value1]
}

if { $Value2 > 0} {   
   set Value2 [expr 0x$Value2]
}


現在行了30分鐘,未見有 error..感覺良好 (d24)
iamjack
剛學走路的小朋友
 
文章: 4
註冊時間: 週三 4月 13, 2011 1:01 am

Re:[問題] TCL 求教...

文章iamjack » 週日 4月 24, 2011 10:28 am

寫了數天....到開始GUI 界面化又市遇上問題....

目前的程式是這樣

代碼: 選擇全部
proc conversion {input} {                                               

#Extracing the string from Hyperteriminal and seperate them into useful information
#ID is the Device ID of the CAN Device ( ie: 100, 110)
#Value is the bit result of the ADC Channel, 2 Byte can store 8 bit of data, the remaining 2bit have been stored in another 2 Byte
# Please Ref MCP25050 Datasheet p44 p45

   set ID [ string range $input 1 3 ]               
   set ::Value(0)      [ string range $input 9 10 ]                               
   set ::Value(1) [ string range $input 12 13 ]       
    set ::Value(2) [ string range $input 15 16 ]
    set ::Value(3) [ string range $input 17 18 ]
    set ValueA(0) [ string index $input 14 ]
    set ValueA(1) [ string index $input 13]
    set ValueA(2) [ string index $input 20 ]
    set ValueA(3) [ string index $input 19 ]
    puts  $input
    puts  -nonewline  "ID: "
     puts  -nonewline $ID
    
    
for {set i 0} {$i < 4} {incr i} {              # Hex to Dex Scan for ADC LSB
   
   switch $ValueA($i) {
      "0" { set ValueA($i) "0" }
      "4" { set ValueA($i) "1" }
      "8" { set ValueA($i) "2" }
      "C" {set ValueA($i) "3" }
   }

if { $::Value($i) > 0} {      set ::Value($i) [expr (0x$::Value($i)*4)+$ValueA($i)]   } else { set ::Value($i) $ValueA($i)}

puts  -nonewline  "   Value$i:  "
puts  -nonewline $::Value($i)

}
    
puts ""


             
       
       
 
        
 }


proc Fetch {channel} {
    set port [gets $channel]
    conversion $port
 }

set com [open com2: r+]
fconfigure $com -mode 9600,n,8,1 -blocking 0 -translation auto -buffering line
fileevent $com readable [list Fetch $com]


#GUI

pack [button .btn -text "STOP!! Kill Switch!!" -command {exit}] -expand 1






出來的是這樣
有 ID, Value(0) 至 Value(3)
一秒3次左右

ID: 100 Value0: 393 Value1: 51 Value2: 384 Value3: 380
t110800F0000180000180
ID: 110 Value0: 0 Value1: 98 Value2: 0 Value3: 6
t100800305F5EC45E5E00
ID: 100 Value0: 382 Value1: 0 Value2: 372 Value3: 374
t110800F0000180000180
ID: 110 Value0: 0 Value1: 98 Value2: 0 Value3: 6
t100800305F60085D5D80


我想做一個簡單的GUI 界面, 把Value Display 在 GUI 上....
把 Value固定好...再做一條vertical bar 跟 value 上下等走...
但是花了整晚都無法把基本dynamic 的 Value display 到 wish 上
像 kill switch 的 static object, variable 是沒問題
本人目前running out of idea....
想請教各位有什麼辦法 / 教學資源的我可以參考
iamjack
剛學走路的小朋友
 
文章: 4
註冊時間: 週三 4月 13, 2011 1:01 am

Re:[問題] TCL 求教...

文章XO » 週日 4月 24, 2011 11:06 pm

下面這一篇你參考看看: Visual Tcl 1.6.1 加强版
還有一郭 SpecTcl 工具也可以抓來試試!
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:[問題] TCL 求教...

文章iamjack » 週一 4月 25, 2011 4:22 am

XO 寫:下面這一篇你參考看看: Visual Tcl 1.6.1 加强版
還有一郭 SpecTcl 工具也可以抓來試試!

看了這篇文章
vtcl 好像 outdate了? 說只support 8.5 , 不支援8.5.9
一會試試spectcl

看了其他 example, 找到了問題所在.

我用了 -text 而不是 -textvariable

用了-textvariable 基本上我想要的都出了來
方向正確....是經驗不足的問題.....
不過TCL/TK真的很易上手....前後加起在都不過數天
現在在試 tk 的 frame 在 x,y coord
iamjack
剛學走路的小朋友
 
文章: 4
註冊時間: 週三 4月 13, 2011 1:01 am


回到 內嵌與腳本化(Embedding & Scripting)

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron