ファイルを加工して送信

ファイルから読み出したデータに情報(バイナリ、テキスト)を付加して送信します。ファイルには NULL が含まれていてもかまいません。string にバイナリデータを付加する場合は、Number2Str を使用して .. で加算していけばフォーマットを作成することができます。また下記の例には含まれていませんが、置換を行う場合は string.gsub を使用します。

-- このスクリプトは、Ver3.00 以降で実行してください。

-----------------------------------------------------------------------
-- name     = calc_bccadd
-- function = BCC計算(加算)
-- note     =
-- param    = buf     : 計算対象バッファ
--          = size    : バッファサイズ
-- output   = BCC上位8ビット、下位8ビット
-----------------------------------------------------------------------
function calc_bccadd( buf, size )
    local sum = 0

    for i=1, size do
        sum = sum + string.byte( buf, i )
    end

    -- 上位、下位8ビット
    local u = BitRShift( BitAnd( sum, 0x0000ff00 ), 8 )
    local l = BitAnd( sum, 0x000000ff )

    return u, l
end

----------------------------------------------------------------
-- 送信バッファ作成し、データ送信
--
--【送信フォーマット】
-- STX n n n n n n (data) ETX BCC BCC CR LF
-- nnnnnn:データサイズ(ASCII文字列、例)001024)
-- データサイズは、(データサイズ+データ)のバイトサイズ
----------------------------------------------------------------
function send_data( data, datasize )
    -- データを文字に変換してセット
    -- データサイズ6バイト+データ+ETX+BCC(2バイト)+CR+LF
    datasize = datasize + 6
    str_txbuf = string.format( "%06d", datasize )
    str_txbuf = str_txbuf .. data .. Number2Str( 0x03, 1 )
    
    -- BCC計算
    bcc1, bcc2 = calc_bccadd( str_txbuf, datasize+1 )
    
    -- string にバイナリデータを格納する場合は、Number2Str を使用します。
    -- string の連結には、.. を使用します。
    str_txbuf = Number2Str( 0x02, 1 ) .. str_txbuf ..
                Number2Str( bcc1, 1 ) .. Number2Str( bcc2, 1 ) ..
                Number2Str( 0x0d, 1 ) .. Number2Str( 0x0a, 1 )
    
    -- データ送信
    SendDataDirect( str_txbuf, #str_txbuf )
end


----------------------------------------------------------------
-- 送信バッファ作成し、データ送信
----------------------------------------------------------------
function read_file()
    -- "rb"と入れないと、CRLF が LF に変換されてしまいます。
    local file = io.open( "c:\\Temp\\test.txt", "rb" )
    local size = 0
    local str = ""
	
    if file then
        -- 現在位置を返します。
        current = file:seek()
		
        -- ファイルサイズを返します。
        size = file:seek( "end" )
        DOut( "filesize=" .. size .. "\n" );
		
        -- 元の位置に戻します。
         file:seek( "set", current )

        -- データ読込み
        str = file:read( "*a" )
        file:close()
    end

    return size, str
end

local l_txdata
local l_txsize
----------------------------------------------------------------
-- タイマハンドラ
----------------------------------------------------------------
function timer_handler()
    send_data( l_txdata, l_txsize )
end

----------------------------------------------------------------
-- メイン
----------------------------------------------------------------
ClrMon()
ShowMon( true )

-- 送信データ読み込み
l_txsize, l_txdata = read_file()

-- 1秒周期で送信
if l_txsize > 0 then
    StartTimer( 1, 1000, "timer_handler" )
end