ファイルを加工して送信
ファイルから読み出したデータに情報(バイナリ、テキスト)を付加して送信します。ファイルには 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