--处理串口数据 localfunctionproc(data) if data == "qwerty"then --模块收到`qwerty`字符串后,回复`asdfgh`字符串 write("asdfgh") end end
剩下两个需求
剩下两个需求处理起来和前面一样,我们直接仿照着改就行:
1 2 3 4 5 6 7 8 9 10 11 12 13
--处理串口数据 localfunctionproc(data) if data == "qwerty"then --模块收到`qwerty`字符串后,回复`asdfgh`字符串 write("asdfgh") elseif data == string.fromHex("AABBCC") then --模块收到`0xaa 0xbb 0xcc`三个字节后,回复`0xdd 0xee 0xff`三个字节 write(string.fromHex("DDEEFF")) elseif data == "abcdefghijklmnopqrstuvwxyz"then --模块收到`abcdefghijklmnopqrstuvwxyz`字符串后,回复`ok`字符串 write("ok") end end
--缓存数据 local buf = "" --处理串口数据 localfunctionproc(data) data = buf..data log.info("testUart.read proc",data) local used = true--数据是否被处理? if data == "qwerty"then --模块收到`qwerty`字符串后,回复`asdfgh`字符串 write("asdfgh") elseif data == string.fromHex("AABBCC") then --模块收到`0xaa 0xbb 0xcc`三个字节后,回复`0xdd 0xee 0xff`三个字节 write(string.fromHex("DDEEFF")) elseif data == "abcdefghijklmnopqrstuvwxyz"then --模块收到`abcdefghijklmnopqrstuvwxyz`字符串后,回复`ok`字符串 write("ok") else --数据没匹配上任何东西,没被使用 used = false end ifnot used then--数据没被使用 if buf == ""then--如果缓冲区是空的 sys.timerStart(function() buf = "" end,500)--500ms后清空缓冲区 end buf = data--数据追加到缓存区 else buf = "" end end
--串口ID,1对应uart1 --如果要修改为uart2,把UART_ID赋值为2即可 local UART_ID = 1
--缓存数据 local buf = "" --处理串口数据 localfunctionproc(data) data = buf..data log.info("testUart.read proc",data) local used = true--数据是否被处理? if data == "qwerty"then --模块收到`qwerty`字符串后,回复`asdfgh`字符串 write("asdfgh") elseif data == string.fromHex("AABBCC") then --模块收到`0xaa 0xbb 0xcc`三个字节后,回复`0xdd 0xee 0xff`三个字节 write(string.fromHex("DDEEFF")) elseif data == "abcdefghijklmnopqrstuvwxyz"then --模块收到`abcdefghijklmnopqrstuvwxyz`字符串后,回复`ok`字符串 write("ok") else --数据没匹配上任何东西,没被使用 used = false end ifnot used then--数据没被使用 if buf == ""then--如果缓冲区是空的 sys.timerStart(function() buf = "" end,500)--500ms后清空缓冲区 end buf = data--数据追加到缓存区 else buf = "" end end
--接收串口数据 localfunctionread() local data = "" --底层core中,串口收到数据时: --如果接收缓冲区为空,则会以中断方式通知Lua脚本收到了新数据; --如果接收缓冲器不为空,则不会通知Lua脚本 --所以Lua脚本中收到中断读串口数据时,每次都要把接收缓冲区中的数据全部读出,这样才能保证底层core中的新数据中断上来,此read函数中的while语句中就保证了这一点 whiletruedo data = uart.read(UART_ID,"*l") --数据不存在时停止接收数据 ifnot data orstring.len(data) == 0thenbreakend --打开下面的打印会耗时 log.info("testUart.read bin",data) log.info("testUart.read hex",data:toHex())
--真正的串口数据处理函数 proc(data) end end
--发送串口数据 functionwrite(s) log.info("testuart.write",s:toHex(),s) uart.write(UART_ID,s) end