H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16)

本文主要是介绍H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。

TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


Lua Uart API 函数说明目录:

uart_cfg(port, BaudRate, Parity, WordLength, StopBits) uart_send(port, bin) len, bin_str = uart_recive(prot, maxlen, TotalTimeout, ByteTimeout) uart_clear_rx(prot) err = modbus_write_u16(port, timeout, addr485, regaddr, value0, value1, value2 ...) err = modbus_write_u32(port, timeout, addr485, regaddr, value0, value1, value2 ...) err = modbus_write_float(port, timeout, addr485, regaddr, value0, value1, value2 ...) err, data1, data2 ... = modbus_read_u16(port, timeout, addr485, regaddr, regnum) err, data1, data2 ... = modbus_read_s16(port, timeout, addr485, regaddr, regnum) err, data1, data2 ... = modbus_read_u32(port, timeout, addr485, regaddr, regnum) err, data1, data2 ... = modbus_read_s32(port, timeout, addr485, regaddr, regnum) err, data1, data2 ... = modbus_read_float(port, timeout, addr485, regaddr, regnum) err = modbus_write_do(port, timeout, addr485, regaddr, value0, value1 ...) err, data1, data2 ... = modbus_read_do(port, timeout, addr485, regaddr, regnum) err, data1, data2 ... = modbus_read_di(port, timeout, addr485, regaddr, regnum)

详细说明:

uart_cfg(port, BaudRate, Parity, WordLength, StopBits) 功能: 配置串口硬件参数 参数:    - port : 串口号, 1 或 7    - BaudRate : 波特率   - Parity : 0-无校验  1-奇校验  2-偶校验   - WordLength : 字长 8或9    - StopBits : 停止位 1,2        返回: 无   范例: uart_cfg(1, 115200, 0, 8, 1) ----------------------------------------------------------uart_send(port, bin) 功能: 发送数据 参数:    - port : 串口号, 1 或 7    - bin : 二进制字符串      返回: 无   范例:       uart_send(1, "12345678")       uart_send(1, "x04x00x12")              bin = "x00x12x34x56"      uart_send(1, bin) ----------------------------------------------------------uart_recive(prot, maxlen, TotalTimeout, ByteTimeout) 功能: 接收串口数据。退出条件满足任意1条:         (1)读到指定个数        (2)没有收到字节,总超时到达 TotalTimeout         (3)收到字节后,字符间超时到达 ByteTimeout 参数:    - port : 串口号, 1 或 7    - maxlen : 最长长度   - TotalTimeout : 总超时,ms    - ByteTimeout : 字节间超时, ms。不提供该参数时,字节间超时等于总超时      返回:  长度, 读取到的二进制字符串   范例:         local str         local len             len, str = uart_recive(1, 200, 2000, 10) --读最大200字节, 总超时2秒, 字符间超时10ms         len, str = uart_recive(1, 200, 2000) --读最大200字节, 总超时2秒,字符间超时2秒     ----------------------------------------------------------uart_clear_rx(prot) 功能: 清空接收缓冲区 参数:    - port : 串口号, 1 或 7        返回: 无   范例:       uart_clear_rx(1) ----------------------------------------------------------int modbus_write_u16(port, timeout, addr485, regaddr, value0, value1, value2 ...) 功能: 发0x06功能码写1个寄存器或者发0x10功能码多个写寄存器,函数收到应答或等待超时才会返回 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址   - value0 : 寄存器值,可以罗列多个寄存器,函数自动识别寄存器个数      返回: err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re            re = modbus_write_u16(1, 100, 1, 0x0000, 0x1234, 0x4567, 0x8888)              local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0         re = modbus_write_u16(port, timeout, addr485, regaddr, 0x1234, 0x4567, 0x8888)       print(re)       beep()        ----------------------------------------------------------int modbus_write_u32(port, timeout, addr485, regaddr, value0, value1, value2 ...) 功能: 发0x10功能码写32位整数寄存器, 2个16位寄存器组合为1个32位寄存器,大端模式 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址   - value0 : 寄存器值,可以罗列多个寄存器,函数自动识别寄存器个数      返回: err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re            re = modbus_write_u32(1, 100, 1, 0x0000, 0x12345678, 0x45678888)              local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0         re = modbus_write_u16(port, timeout, addr485, regaddr, 0x12345678, 0x45678888)       print(re)       beep()    ----------------------------------------------------------int modbus_write_float(port, timeout, addr485, regaddr, value0, value1, value2 ...) 功能: 发0x10功能码写单精度浮点寄存器, 2个16位寄存器组合为1个32位浮点寄存器,大端模式 float_ABCD 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址   - value0 : 寄存器值,可以罗列多个寄存器,函数自动识别寄存器个数      返回: err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re            re = modbus_write_float(1, 100, 1, 0x0000, -0.1234, 789.123)              local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0         re = modbus_write_u16(port, timeout, addr485, regaddr, -0.1234, 789.123)       print(re)       beep()        ----------------------------------------------------------modbus_read_u16(port, timeout, addr485, regaddr, regnum) 功能: 发0x03功能码读16位无符号整数寄存器 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址   - regnum : 寄存器个数      返回: err_code, value0, value1 ...          err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re       local data1       local data2          local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0       local value = {}                value = {modbus_read_u16(port, timeout, addr485, regaddr, 2)}       -- value[1] : 错误代码      -- value[2] : 第1个寄存器的值      -- value[3] : 第3个寄存器的值             re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)       -- re : 错误代码      -- data1 : 第1个寄存器的值      -- data2 : 第2个寄存器的值 ----------------------------------------------------------modbus_read_s16(port, timeout, addr485, regaddr, regnum) 功能: 读16位有符号整数寄存器,用法同 modbus_read_u16() ----------------------------------------------------------modbus_read_u32(port, timeout, addr485, regaddr, regnum) 功能: 读32位无符号整数寄存器,用法同 modbus_read_u16()        2个16位寄存器组合为1个32位寄存器 ----------------------------------------------------------modbus_read_s32(port, timeout, addr485, regaddr, regnum) 功能: 读32位有符号整数寄存器,用法同 modbus_read_u16()        2个16位寄存器组合为1个32位寄存器 ----------------------------------------------------------modbus_read_float(port, timeout, addr485, regaddr, regnum) 功能: 读32位单精度浮点寄存器,用法同 modbus_read_u16()        2个16位寄存器组合为1个32位寄存器 ----------------------------------------------------------modbus_write_do(port, timeout, addr485, regaddr, value0, value1 ...) 功能: 发0x10功能码写1个或多个DO寄存器(控制继电器) 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址   - value0 : 寄存器值,0或1. 可以罗列多个寄存器,函数自动识别寄存器个数   返回: err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0         re = modbus_write_do(port, timeout, addr485, regaddr, 1, 0, 1, 1, 0) --写0开始的5个寄存器      print(re)        ----------------------------------------------------------modbus_read_do(port, timeout, addr485, regaddr, regnum) 功能: 发0x01功能码读DO寄存器 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址,起始地址   - regnum : 寄存器个数      返回: err_code, value0, value1 ...          err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re       local data1       local data2          local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0       local value = {}                value = {modbus_read_do(port, timeout, addr485, regaddr, 2)}       -- value[1] : 错误代码      -- value[2] : 第1个寄存器的值      -- value[3] : 第3个寄存器的值             re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)       -- re : 错误代码      -- data1 : 第1个寄存器的值      -- data2 : 第2个寄存器的值 ----------------------------------------------------------modbus_read_di(port, timeout, addr485, regaddr, regnum) 功能: 发0x02功能码读DI寄存器 参数:    - port : 串口号, 1 或 7    - timeout : 超时   - addr485 :485地址 0-255    - regaddr : 寄存器地址,起始地址   - regnum : 寄存器个数      返回: err_code, value0, value1 ...          err_code 错误代码               0x00  OK                0x01  不支持的功能码        0x02  寄存器地址错误               0x03  数据值域错误               0x04  写入失败               0x05  自己定义错误包应答               0x06  超时 自定义的 */    范例:       local re       local data1       local data2          local port = 1       local timeout = 100       local addr485 = 1       local regaddr = 0       local value = {}                value = {modbus_read_do(port, timeout, addr485, regaddr, 2)}       -- value[1] : 错误代码      -- value[2] : 第1个寄存器的值      -- value[3] : 第3个寄存器的值             re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)       -- re : 错误代码      -- data1 : 第1个寄存器的值      -- data2 : 第2个寄存器的值      


举例说明:

我们这里简单做一个回环测试,大家仅需将TOOL的TTLTX和TTLRX短接即可。

测试代码:

uart_cfg(1, 115200, 0, 8, 1)uart_send(1, "12345678www.armbbs.cn")len, str = uart_recive(1, 200, 1000, 10)print(str)执行效果如下:

 

这篇关于H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持

文章版权声明:除非注明,否则均为 谢士广博客 原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,9524人围观)

还没有评论,来说两句吧...

目录[+]