编辑代码

local function Checksum(chkbuf,buflen)
 	local xorconst = 0xA001
 	local sum = 0xFFFF
	local max_len = #chkbuf
	if buflen < max_len then
		max_len = buflen
	end
 	for i = 1,max_len  do
		sum  =  (sum~(0xFFFF&chkbuf[i]))
		for Counter = 1,8,1 do
			if(sum&0x01)~=0 then
				sum  = (sum>>1)~xorconst
			else
				sum  = sum>>1
			end
		end
	end
 	local sum1 = (sum & 0x00FF)
 	sum1 = sum1 <<  8
 	sum1 = sum1 + (sum  >>  8)
 	return sum1
end

function byteCDAB_ToFloat( byte_buff )
	if byte_buff == nil then
		return 0
	end
	local _byteCD = (byte_buff[1]<<8|byte_buff[2]);
	local _byteAB = (byte_buff[3]<<8|byte_buff[4]);
	local hexNums = (_byteAB<<16)|_byteCD;
	local sign = math.modf(hexNums/(2^31))
	local exponent = hexNums % (2^31)
	exponent = math.modf(exponent/(2^23)) -127
	local mantissa = hexNums % (2^23)
	for i=1,23 do
		mantissa = mantissa / 2
	end
	mantissa = 1+mantissa
	local result = (-1)^sign * mantissa * 2^exponent
	return result
end

function type57511_to_mb_rtu(raw_data)
	if #raw_data<78 then
        print("raw_data length less than 78")
		return nil
	end
	buff4 = {raw_data[67],raw_data[68],raw_data[69],raw_data[70]}
	TEMP = byteCDAB_ToFloat(buff4)	
	buff4 = {raw_data[71],raw_data[72],raw_data[73],raw_data[74]}
	HeadWater = byteCDAB_ToFloat(buff4)
	buff4 = {raw_data[75],raw_data[76],raw_data[77],raw_data[78]}
	WaterLevel = byteCDAB_ToFloat(buff4)
	reslt = {["TEMP"]=TEMP,["HeadWater"]=HeadWater,["WaterLevel"]=WaterLevel}
	return reslt
end


function type57511_com_test ()
	--release before memory
	ret = {}
	--creat data for text
	for i=1,198 do
		ret[i]=i;
	end
	
	--set test reslt
	--TEMP
	ret[67]=0x00
	ret[68]=0x00
	ret[69]=0x3F
	ret[70]=0x00
	--HeadWater
	ret[71]=0x99
	ret[72]=0x9A
	ret[73]=0x3F
	ret[74]=0x19
	--WaterLevel
	ret[75]=0xCC
	ret[76]=0xCD
	ret[77]=0xBF
	ret[78]=0x4C

	local testSumVar = Checksum(ret,(#ret-2))
	ret[#ret-1] = 0xFF&(testSumVar>>8)
	ret[#ret] = 0xFF&testSumVar
	
	--decode result
	--check data length
	if #ret < 78 then
		print("Receive data length is less than 78")
		return -5
	end
	
	--Checksum check
	local checkSumVar = Checksum(ret,(#ret-2))
	local revSunVar = ((ret[#ret-1]&0x00FF)<<8 |(0x00FF&ret[#ret]))
	if revSunVar~=checkSumVar  then
		print("Error Checksum.")
		return -6
	end

	--receive right data
	local decode_data = type57511_to_mb_rtu(ret)
	if decode_data==nill then
		print("Error to decode result.")
		return -7
	end
	
	return decode_data
end

function main()
    print("start.")
	print(type57511_com_test())
    print("end")
end

main()