データ送信

指定範囲のデータを折り返しながら繰り返し送信するスクリプトです。

-- 送信データテーブル(全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()