我在我的 tcl 代码中使用了一个主脚本,我在其中打开了一个 udp 端口来读取它上面的数据。我已经使用 fileevent 进行了此操作,我正在使用“vwait”命令进入事件循环。但我不希望主脚本因此而被阻止。简而言之,我希望主脚本继续流动,等待 udp 数据事件应该在后台。如何实现这一点。请帮我。我为此浪费了很多时间,但一切都顺理成章。任何帮助都会非常显着。
这是我的主要脚本:
#!/usr/bin/env tclsh8.5
proc create_udp_payload { command data } {
set payload ""
append payload $command
append payload [ format %08x [ expr $data ] ]
return $payload
}
proc send_udp_packet { payload } {
puts -nonewline $soc::s [binary format H* $payload]
puts "\nTransmitting the UDP payload $payload"
return 0
}
set DEST_IP_ADDR 10.10.20.241
set DEST_UDP_PORT 5558
set soc::s [udp_open]
puts "Listening on udp port : [fconfigure $soc::s -myport]"
udp_conf $soc::s $DEST_IP_ADDR $DEST_UDP_PORT
fconfigure $soc::s -buffering none -translation binary
fileevent $soc::s readable [list ::udp_listen]
for { set j 0 } { $j < 10 } { incr j} {
puts "Sending read request to read register $j"
set command "00"
append command [format %02x $j]
send_udp_packet [create_udp_payload $command 0x0000]
after 1000
flush $soc::s
}
wait forever #to enter into the event loop
for { set j 2 } { $j < 12 } { incr j} {
puts "Sending write request to write register $j"
set command "80"
append command [format %02x $j]
send_udp_packet [create_udp_payload $command [expr {0x0000 | $j }] ]
after 2000
flush $soc::s
}
实际上,我想从硬件中一个一个地读取 10 个寄存器,为此我使用了一个 for 循环,但我不知道如何为此进入事件循环。因为它阻塞了主脚本。同样在那之后我想一个一个地写相同硬件的10个寄存器。任何人都可以修改此代码以相应地工作。在此先感谢您........