ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-17 15:59:30  阅读:120  来源: 互联网

标签:01 regaddr addr485 16 串口 timeout 寄存器 local port


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短接即可。

测试代码:

uart_cfg(1, 115200, 0, 8, 1)

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

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

执行效果如下:

 

标签:01,regaddr,addr485,16,串口,timeout,寄存器,local,port
来源: https://blog.csdn.net/Simon223/article/details/122541714

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有