如何将来自串行端口的传入变量保存到列表中



我想保存通过串行端口传入的 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

最新更新