high_volume_uart.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. --[[
  2. @module high_volume_uart
  3. @summary 串口大数据收发功能模块
  4. @version 1.0
  5. @date 2025.09.23
  6. @author 魏健强
  7. @usage
  8. 本demo演示的核心功能为:
  9. 1.开启串口,配置波特率等参数;
  10. 2.设置接收回调函数
  11. 3.定时向串口发送数据
  12. 4.使用zbuff的方式收发数据
  13. ]]
  14. local uartid = 1 -- 根据实际设备选取不同的uartid
  15. uart_mode_zbuff = true -- 是否使用zbuff方式收发数据收发
  16. local function uart_send_cb(id)
  17. log.info("uart", id , "数据发送完成回调")
  18. end
  19. if uart_mode_zbuff then
  20. local rxbuff = zbuff.create(10240) -- 接收数据的zbuff
  21. local txbuff = zbuff.create(10240) -- 发送数据的zbuff
  22. local function uart_send()
  23. -- 循环两秒向串口发一次数据
  24. while true do
  25. sys.wait(10000)
  26. --发送数据
  27. uart.tx(uartid, txbuff)
  28. end
  29. end
  30. local function uart_cb(id, len) -- 串口接收数据回调函数
  31. while 1 do
  32. log.info("uart", "缓冲区", uart.rxSize(id))
  33. local len = uart.rx(id, rxbuff)
  34. if len <= 0 then
  35. break
  36. end
  37. log.info("uart", "receive", id, rxbuff:used(), rxbuff:query())
  38. rxbuff:seek(0)
  39. end
  40. end
  41. txbuff:write("测试数据") -- 向发送数据的zbuff写入数据
  42. -- 初始化
  43. uart.setup(uartid, -- 串口id
  44. 115200, -- 波特率
  45. 8, -- 数据位
  46. 1, -- 停止位
  47. uart.NONE, -- 校验位,可选 uart.None/uart.Even/uart.Odd。默认 uart.None 无校验
  48. uart.LSB, -- 大小端,默认小端 uart.LSB, 可选 uart.MSB
  49. 10240 -- 缓冲区大小,默认值1024,接收大数据时需要根据数据大小增大缓冲区
  50. )
  51. -- 收取数据会触发回调, 这里的"receive" 是固定值
  52. uart.on(uartid, "receive", uart_cb)
  53. -- 发送数据完成会触发回调, 这里的"sent" 是固定值
  54. uart.on(uartid, "sent", uart_send_cb)
  55. sys.taskInit(uart_send)
  56. else
  57. local function uart_send()
  58. -- 循环两秒向串口发一次数据
  59. while true do
  60. sys.wait(2000)
  61. uart.write(uartid, "test data.")
  62. end
  63. end
  64. local function uart_cb(id, len)
  65. local s = ""
  66. repeat
  67. s = uart.read(id, 10240) -- 一次性读出所有缓冲区中的数据,避免分包
  68. if #s > 0 then -- #s 是取字符串的长度
  69. -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
  70. log.info("uart", "receive", id, #s, s)
  71. -- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
  72. end
  73. until s == ""
  74. end
  75. -- 初始化
  76. uart.setup(uartid, -- 串口id
  77. 115200, -- 波特率
  78. 8, -- 数据位
  79. 1, -- 停止位
  80. uart.NONE, -- 校验位,可选 uart.None/uart.Even/uart.Odd。默认 uart.None 无校验
  81. uart.LSB, -- 大小端,默认小端 uart.LSB, 可选 uart.MSB
  82. 10240 -- 缓冲区大小,默认值1024,接收大数据时需要根据数据大小增大缓冲区
  83. )
  84. -- 收取数据会触发回调, 这里的"receive" 是固定值
  85. uart.on(uartid, "receive", uart_cb)
  86. -- 发送数据完成会触发回调, 这里的"sent" 是固定值
  87. uart.on(uartid, "sent", uart_send_cb)
  88. sys.taskInit(uart_send)
  89. end