testUart2Task.lua 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. --- 模块功能:串口2功能测试
  2. -- @author openLuat
  3. -- @module uart.testUartTask
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.05.24
  7. --[[
  8. 注意:UART2 在开机后会自动打印一段log,波特率921600,这段log不能通过修改软件来关闭,推荐优先使用UART1和UART3
  9. UART2打印的Log如下:
  10. RDA8910m Boot_ROM V1.0-17b887ec
  11. HW_CFG: 36
  12. SW_CFG: 0
  13. SE_CFG: 0
  14. check flash img
  15. load complete! checking......
  16. Security Disabled
  17. Check uImage Done
  18. Run ...
  19. ]]
  20. module(...,package.seeall)
  21. require"utils"
  22. require"pm"
  23. --[[
  24. 功能定义:
  25. uart接收数据,如果100毫秒没有收到新数据,则打印出来所有已收到的数据,清空数据缓冲区,回复received x frame给对端,然后等待下次数据接收
  26. 注意:
  27. 串口帧没有定义结构,仅靠软件延时,无法保证帧的完整性,如果对帧接收的完整性有严格要求,必须自定义帧结构(参考testUart.lua)
  28. 因为在整个GSM模块软件系统中,软件定时器的精确性无法保证,例如本demo配置的是100毫秒,在系统繁忙时,实际延时可能远远超过100毫秒,达到200毫秒、300毫秒、400毫秒等
  29. 设置的延时时间越短,误差越大
  30. ]]
  31. --串口ID,2对应uart2
  32. --如果要修改为uart1,把UART_ID赋值为2即可
  33. local UART_ID = 2
  34. local function taskRead()
  35. local cacheData,frameCnt = "",0
  36. while true do
  37. local s = uart.read(UART_ID,"*l")
  38. if s == "" then
  39. if not sys.waitUntil("UART_RECEIVE",100) then
  40. --uart接收数据,如果100毫秒没有收到数据,则打印出来所有已收到的数据,清空数据缓冲区,等待下次数据接收
  41. --注意:
  42. --串口帧没有定义结构,仅靠软件延时,无法保证帧的完整性,如果对帧接收的完整性有严格要求,必须自定义帧结构(参考testUart.lua)
  43. --因为在整个GSM模块软件系统中,软件定时器的精确性无法保证,例如本demo配置的是100毫秒,在系统繁忙时,实际延时可能远远超过100毫秒,达到200毫秒、300毫秒、400毫秒等
  44. --设置的延时时间越短,误差越大
  45. if cacheData:len()>0 then
  46. log.info("testUartTask.taskRead","100ms no data, received length",cacheData:len())
  47. --数据太多,如果全部打印,可能会引起内存不足的问题,所以此处仅打印前1024字节
  48. log.info("testUartTask.taskRead","received data",cacheData:sub(1,1024))
  49. cacheData = ""
  50. frameCnt = frameCnt+1
  51. write("received "..frameCnt.." frame")
  52. end
  53. end
  54. else
  55. cacheData = cacheData..s
  56. end
  57. end
  58. end
  59. --[[
  60. 函数名:write
  61. 功能 :通过串口发送数据
  62. 参数 :
  63. s:要发送的数据
  64. 返回值:无
  65. ]]
  66. function write(s)
  67. log.info("testUartTask.write",s)
  68. uart.write(UART_ID,s.."\r\n")
  69. end
  70. local function writeOk()
  71. log.info("testUartTask.writeOk")
  72. end
  73. --保持系统处于唤醒状态,此处只是为了测试需要,所以此模块没有地方调用pm.sleep("testUartTask")休眠,不会进入低功耗休眠状态
  74. --在开发“要求功耗低”的项目时,一定要想办法保证pm.wake("testUartTask")后,在不需要串口时调用pm.sleep("testUartTask")
  75. pm.wake("testUartTask")
  76. --注册串口的数据发送通知函数
  77. uart.on(UART_ID,"sent",writeOk)
  78. uart.on(UART_ID,"receive",function() sys.publish("UART_RECEIVE") end)
  79. --配置并且打开串口
  80. uart.setup(UART_ID,115200,8,uart.PAR_NONE,uart.STOP_1)
  81. --如果需要打开“串口发送数据完成后,通过异步消息通知”的功能,则使用下面的这行setup,注释掉上面的一行setup
  82. --uart.setup(UART_ID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
  83. --启动串口数据接收任务
  84. sys.taskInit(taskRead)