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

时间:2019-04-03 13:31:17

标签: tcl

我想保存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 似乎可以工作?要更改真实列表,我需要更改什么?

1 个答案:

答案 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集成

  

我已经创建了这样的GUI,我想在其中放置这些变量    进入标签

将标签窗口小部件连接到全局变量::result,以便标签在proc receiver中的变量更改时更新。

label .l -textvar ::result