• H7TOOL的LUA小程序教程第5期:串口开发,含Modbus(20220116)


    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)

    执行效果如下:

  • 相关阅读:
    Scars To Your Beautiful
    【BZOJ1833】【ZJOI2010】数字计数(数位DP)
    滑块拼图
    神经元(prufer序列+dp)
    sequence(dp+hash+二分搜索+前缀和优化)
    循环移位(后缀自动机)
    MST(最小生成树+倍增)
    nyoj 845【水】
    分割问题【知识点】
    扩展欧几里得【知识点】
  • 原文地址:https://www.cnblogs.com/armfly/p/15813592.html
Copyright © 2020-2023  润新知