データ送信
指定範囲のデータを折り返しながら繰り返し送信するスクリプトです。
-- 送信データテーブル(全10バイト)
-- インデックスアクセス用に1バイトずつの文字をテーブルに格納しています。
-- インデックスデータは下記とします。
-- 1 : STX
-- 2,3,4,5 : データ(±nnn)
-- 6 : ETX
-- 7,8 : BCC(STXの次からETXまでのXOR、上位、下位4ビットに分けてASCII変換)
-- 9,10 : CR/LF
tx_tbl = { "\002", " ", " ", " ", " ", "\003", " "," ", "\r", "\n" }
min = -20 -- 最小
max = 50 -- 最大
inc = 1 -- 増減値
data = 10 -- データ(初期値は10)
----------------------------------------------------------------
-- BCC計算
-- STXの次からETXまでのXOR、上位、下位4ビットずつに分けてASCIIに変換
-- buf : バッファ(table)
-- spos : 計算開始インデックス
-- epos : 計算終了インデックス
-- 戻り値 : BCC2バイト(上位、下位)
----------------------------------------------------------------
function cal_bcc( buf, spos, epos )
str = Tbl2Str( buf )
bcc = string.byte( str, spos )
for i=spos+1, epos do
bcc = BitXor( bcc, string.byte( str, i ) )
end
-- 上位、下位に分ける
u = BitAnd( BitRShift( bcc, 4 ), 15 )
l = BitAnd( bcc, 15 )
-- ASCII変換
u = string.format( "%X", u )
l = string.format( "%X", l )
return u, l
end
----------------------------------------------------------------
-- 送信バッファ作成
-- 戻り値 : 送信バッファ(string)
----------------------------------------------------------------
function make_txbuf()
-- オリジナルテーブルをローカル変数にコピー
tx_buf = tx_tbl
-- データを文字に変換してセット
str = string.format( "%04d", data )
if data >= 0 then
tx_buf[ 2 ] = " " -- +の場合はスペース
else
tx_buf[ 2 ] = "-"
end
tx_buf[ 3 ] = string.sub( str, 2, 2 )
tx_buf[ 4 ] = string.sub( str, 3, 3 )
tx_buf[ 5 ] = string.sub( str, 4, 4 )
-- データ更新(最小、最大間で折り返し)
data = data + inc
if data > max then
data = max - inc
inc = inc * -1
elseif data < min then
data = min - inc
inc = inc * -1
end
-- BCC計算
tx_buf[ 7 ], tx_buf[ 8 ] = cal_bcc( tx_buf, 2, 6 )
return Tbl2Str( tx_buf )
end
----------------------------------------------------------------
-- タイマハンドラ
----------------------------------------------------------------
function timer_handler()
-- データ送信
txdata = make_txbuf()
len = string.len( txdata )
SendDataDirect( txdata, len )
DOut( "data=[" .. string.sub( txdata, 2, 5 ) .. "]" ..
", bcc=[" .. string.sub( txdata, 7, 8 ) .. "]\n" )
end
----------------------------------------------------------------
-- 3秒周期でデータを送信します。
----------------------------------------------------------------
StartTimer( 1, 3000, "timer_handler" )
ShowMon( true )
ClrMon()