前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16)

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

作者头像
Simon223
发布2022-03-10 14:11:04
4910
发布2022-03-10 14:11:04
举报

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, "\x04\x00\0x12") bin = "\x00\x12\x34\x56" 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短接即可。

测试代码:

代码语言:javascript
复制
uart_cfg(1, 115200, 0, 8, 1)

uart_send(1, "12345678www.armbbs.cn")

len, str = uart_recive(1, 200, 1000, 10) 
print(str)

执行效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档