我想保存7个通过串行端口传入的变量。传输从空行开始,然后是7行,每行由一个变量组成。没有空格,但在每一行末尾都有回车符。每个变量也可以包含空格。这是重复进行的。 如果空行会引起问题,则可以在我的外部设备中忽略它。
float a = 37.777779;
int b = a; // b = 37
float c = a - b; // c = 0.777779
c *= 100; // c = 77.777863
int d = c; // d = 77;
a = b + d / (float)100; // a = 37.770000;
#!/ 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
所有7个变量都是可见的,但它们之间有空行。 “ Lok4”和“ Lok6”之间的空行似乎可以,因为这是一个由空格组成的变量。
我试图用START
ChME3
562264
Lok3
Lok4
Lok6
创建一个列表。但这不能正常工作。使用set ::result [split $data "\n"]
,控制台将显示7个变量:
foreach Element $::result {puts $Element}
我在此处手动插入了Lok4和Lok6之间的点,仅用于显示目的。实际上,这是一个仅包含空格的变量。
尽管它看起来像一个列表,但如果我尝试START
ChME3
562264
Lok3
Lok4
.
Lok6
它显示
puts "Element 0 [lindex $::result 0]"
puts "Element 1 [lindex $::result 1]"
,依此类推。
元素1保持为空,并且元素0连续分配给每个变量。
因此,这显然不是清单。但是我不知道为什么Element 0 START
Element 1
Element 0 ChME3
Element 1
Element 0 562264
似乎可以工作?要更改真实列表,我需要更改什么?
答案 0 :(得分:0)
但是我无法检索到它。还是我必须创建一个自己的新列表?
在这一步骤中,使用gets
检索结果,并使用split
将其转换为列表:
[split [gets $chan] {}]
要将此列表保存起来,请将列表值分配给范围超出周围proc的变量,例如,全局变量或名称空间变量:
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