tclコードでメインスクリプトを使用しており、udpポートを開いてそこにあるデータを読み取ります。これは、「vwait」コマンドを使用してイベントループに入っているfileeventを使用して作成しました。しかし、これが原因でメインスクリプトがブロックされることは望ましくありません。要するに、メインスクリプトをフローで継続し、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
}
実際、forループを使用しているハードウェアから10個のレジスタを1つずつ読み取りたいのですが、このためにイベントループに入る方法がわかりません。メインスクリプトをブロックするからです。また、その後、同じハードウェアのレジスタを1つずつ書き込みたいと思います。誰かがそれに応じて動作するようにこのコードを変更してください。よろしくお願いします........