我想保存通过串行端口传入的 7 个变量。传输从空行开始,然后是 7 行,每行由一个变量组成。没有空白,但每行末端都有一个回车符。每个变量也可以由空白组成。这是反复进行的。 如果空行会导致问题,则可以在我的外部设备中省略它。
#!/ usr /bin/env wish
console show
set Term(Port) com5
set Term(Mode) "9600,n,8,1"
set result [list]
set data {}
proc receiver {chan} {
set data [gets $chan]
concat {*}[split $data n]
set ::result [split $data "n"]
#puts $data
#puts $::result
#foreach Element $::result {
#puts $Element}
#puts "Element 0 [lindex $::result 0]"
#puts "Element 1 [lindex $::result 1]"
return
}
set chan [open $Term(Port) r+]
fconfigure $chan -mode $Term(Mode) -translation binary -buffering none -blocking 0
fileevent $chan readable [list receiver $chan]
puts $data
显示以下内容:
START
ChME3
562264
Lok3
Lok4
Lok6
所有 7 个变量都是可见的,但中间有空行。"Lok4"和"Lok6"之间的空行似乎没问题,因为这是一个由空格组成的变量。
我尝试创建一个带有set ::result [split $data "n"]
的列表。但这不能正常工作。通过foreach Element $::result {puts $Element}
控制台显示 7 个变量:
START
ChME3
562264
Lok3
Lok4
.
Lok6
我在块引用中手动插入了 Lok4 和 Lok6 之间的点,仅用于显示目的。实际上,它是一个仅由空白组成的变量。
尽管它看起来像一个列表,但如果我尝试
puts "Element 0 [lindex $::result 0]"
puts "Element 1 [lindex $::result 1]"
它显示
Element 0 START
Element 1
Element 0 ChME3
Element 1
Element 0 562264
等等。 元素 1 保持为空,元素 0 与每个变量连续赋值。 所以它显然不是一个列表。但我想知道,为什么foreach Element $::result {puts $Element}
似乎有效?我必须更改什么才能获得真实列表?
但我无法检索它。还是我必须创建自己的新列表?
使用gets
检索结果,并在此步骤中使用split
将其转换为列表:
[split [gets $chan] {}]
要隐藏此列表,请将列表值分配给范围超出周围进程的变量,例如,全局或命名空间变量:
set ::result [split [gets $chan] {}]
在上下文中:
proc receiver {chan} {
set data [gets $chan]
set ::result [concat {*}[split $data n]]
# set ::result [split [gets $chan] {}]
# puts $::result; # debug print-out
return
}
图形用户界面集成
我已经创建了这样一个 GUI,我想在其中放置这些变量 进入标签
将标签小部件连接到全局变量::result
,因此标签会在proc receiver
中更改变量时更新。
label .l -textvar ::result