关于tcl 串口通讯 问题

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

版主: b80203, ghost3401, XO, maa

分享到: Facebook

关于tcl 串口通讯 问题

文章demon0354 » 週四 12月 08, 2011 2:19 pm

fconfigure $iChannel -mode $9600,n,8,1配置好管道后,
向串口发送命令:puts $iChannel 。 怎么获得DUT设备上面的返回值?

只能 用gets 一行行获取么?

tcllib中有现成的proc么?

comm,term 两个 package 里面有封装好的么?

谢谢了
QQ:467182410
demon0354
剛學走路的小朋友
 
文章: 6
註冊時間: 週四 12月 08, 2011 2:12 pm

Re:关于tcl 串口通讯 问题

文章XO » 週四 12月 08, 2011 6:22 pm

Tclers wiki: http://wiki.tcl.tk 可以造訪一下...
鍵入 serial 做關鍵字搜尋,有些 wiki 頁面可資參考。

Tcl 的強項之一是 Event Driven I/O.

你還可以進一步將開啟的' Serial channel 的 -blocking 設為 0 (非阻攔模式),
然後透過 fileevent 這個指令交代一旦上述 channel 變成 Readable 時,去呼叫
你指定的 proc,就這一頁所示:

serial ports on Windows
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

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

Re:关于tcl 串口通讯 问题

文章demon0354 » 週四 12月 08, 2011 11:55 pm

代碼: 選擇全部
 # simple serial port example to send AT to modem and
 # wait for OK response in a fixed amount of time.  At the
 # bottom is a simple loop to do this 20x to check serial
 # handler reliability...
 #
 # Works well on Tcl 8.0 and up on Unix (Solaris/NT), poorly on
 # the tclsh included with Tcl 8.1.1 on NT, but pretty well on
 # the wish included with same.
 #
 # NOTE may need to set comPort appropriately for your
 # platform.  Must have a modem configured to respond
 # with "OK" to "AT" commands.
 #
 # switch $tcl_platform(os) {
 #     {Linux}            {set comPort /dev/modem}
 #     {SunOS}            {set comPort /dev/cua/a}
 #     {Windows NT}       {set comPort COM2:}
 #     default            {error "Must configure comPort"}
 # }
 set waitSecs 4
 set nTries   5

 #
 # A cheap version of expect.
 #
 # Set up a event-driven I/O reader on the channel, output the
 # string, and wait some number of seconds for the result.
 #
 # @param fh
 #        a channel opened in non-blocking mode for I/O
 #        with buffering turned off.
 #
 # @param outstr
 #        a string to send to the output channel -- note: end-
 #        of-line characters must be included in this string,
 #        if desired.
 #
 # @param regexp
 #        regular expression to match in the incoming data.
 #
 # @param seconds
 #        number of seconds to wait for above match
 #
 # @throws error
 #        if eof is detected on the channel while waiting
 #
 # @returns int
 #        1 if a match is found, 0 otherwise.
 #
 proc send_expect {fh outstr regexp seconds} {
     global send_exp

     # make sure global vars are initialized properly
     set send_exp($fh.matched)        0
     if {![info exists send_exp($fh.buffer)]} {
         set send_exp($fh.buffer) {}
     }

     # set up our Read handler before outputting the string.
     if {![info exists send_exp($fh.setReader)]} {
         fileevent $fh readable [list private_send_exp_reader \
                 $fh $regexp]
         set send_exp($fh.setReader) 1
     }

     # output the string to send
     puts -nonewline $fh $outstr
     flush $fh

     # set up a timer so that we wait a limited amt of seconds
     set afterId [after [expr {$seconds*1000}] \
             [list set send_exp($fh.matched) 0]]
     vwait send_exp($fh.matched)
     set matched $send_exp($fh.matched)
     unset send_exp($fh.matched)
     catch [list after cancel $afterId]

     # If we got an eof, then throw an error
     if {$matched < 0} {
         error "Channel EOF while waiting for data"
         return 0
     }
     return $matched
 }

 #
 # PRIVATE channel read event handler for send_expect.  Should
 # not be called by user.
 #
 proc private_send_exp_reader {fh regexp} {
     global send_exp

     if {[eof $fh]} {
         close $fh
         set send_exp($fh.matched) -1
         return
     }
     append send_exp($fh.buffer) [read $fh]
     if {[regexp $regexp $send_exp($fh.buffer)]} {
         set send_exp($fh.matched) 1
     }
 }

 #
 # Return the current contents of the send_expect buffer
 #
 # @param fh
 #        channel identifier that was used with send_expect
 #
 # @returns string
 #        the current contents of the buffer for the channel
 #
 proc send_exp_getbuf {fh} {
     global send_exp
     return $send_exp($fh.buffer)
 }

 #
 # Reset the send_expect buffer, returning its contents
 #
 # @param fh
 #        channel identifier that was used with send_expect
 #
 # @returns string
 #        the current contents of the buffer for the channel
 #
 proc send_exp_resetbuf {fh} {
     global send_exp

     set buf $send_exp($fh.buffer)
     set send_exp($fh.buffer) {}
     return $buf
 }

 #
 # Close out a send_expect session, closing I/O event handler
 #
 # @param fh
 #        channel identifier that was used with send_expect
 #
 # @returns
 #        the channel identifier passed as the fh parameter
 #
 proc send_exp_end {fh} {
     global send_exp

     fileevent $fh readable {}
     foreach v [array names send_exp $fh.*] {
         catch [list unset send_exp($v)]
     }
     return $fh
 }

 ##
 ## MAIN
 ##
 set comPort "com1"
 set fh [open $comPort r+]
 fconfigure $fh -blocking 0 -buffering none \
         -mode 9600,n,8,1 -translation binary -eofchar {}

 # Loop nTries times, sending AT to modem and expecting OK.
 set nMatches 0
 for {set i 0} {$i < $nTries} {incr i} {
     if {[send_expect $fh "show version\r" "RA1042 Version 1.3" $waitSecs]} {
         incr nMatches
         regsub -all "\r" [send_exp_getbuf $fh] {\r} buf
         regsub -all "\n" $buf {\n} buf
         puts "GOT MATCH: <$buf>"
     } else {
         puts "NO MATCH IN $waitSecs SECONDS"
     }
     send_exp_resetbuf $fh
 }
 send_exp_end $fh
 close $fh
 puts "Matched $nMatches/$nTries\
         ([expr 100.0*$nMatches/$nTries]%)"


这是wiki的例子。我想问在tcllib中 有没有package能替代上面proc send_expect 的。 特别问一下 comm term 这两个包用的多么。 怎么能更好的应用这两个package
QQ:467182410
demon0354
剛學走路的小朋友
 
文章: 6
註冊時間: 週四 12月 08, 2011 2:12 pm

Re:关于tcl 串口通讯 问题

文章XO » 週五 12月 09, 2011 3:50 pm

樓上的芳鄰...
沒時間細看,不過感覺上 Tcl 的 Expect 應該是你在找的吧!?

TCL/expect的使用

可以跳過 11.1.1 的 Tcl 介紹,直接捲到下方的 11.1.2 節。

看看這個是不是你要的。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

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

Re:关于tcl 串口通讯 问题

文章demon0354 » 週五 12月 09, 2011 5:26 pm

XO 寫:樓上的芳鄰...
沒時間細看,不過感覺上 Tcl 的 Expect 應該是你在找的吧!?

TCL/expect的使用

可以跳過 11.1.1 的 Tcl 介紹,直接捲到下方的 11.1.2 節。

看看這個是不是你要的。


那个 。。。expect 自己封装的spawn 不能再windows下打开窗口。所以后续的expect,expect_out(buffer)都不能使用。

上面的 send_expect 是http://wiki.tcl.tk/447 中提到的例子。 我只想问在tcllib中有没有封装好的package 可以代替 proc send_expect {args} {} 或者 TCL/expect 中的spawn 怎么打开串口
QQ:467182410
demon0354
剛學走路的小朋友
 
文章: 6
註冊時間: 週四 12月 08, 2011 2:12 pm


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

誰在線上

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