3.通訊功能
#i2c模块 ##常量 i2c.SLOW, i2c.TRANSMITTER, i2c. RECEIVER. FAST(400k)模式目前不支持。
i2c.setup()
####描述 初始化i2c。
####语法 i2c.setup(id, pinSDA, pinSCL, speed)
####参数 id = 0
pinSDA: 112, IO编号
pinSCL: 112, IO编号
speed: i2c.SLOW
####返回值 返回设置的速度
####参见 - i2c.read()
i2c.start()
####描述 启动i2c传输。
####语法 i2c.start(id)
####参数 id = 0
####返回值 nil
####参见 - i2c.read()
i2c.stop()
####描述 停止i2c传输。
####语法 i2c.stop(id)
####参数 id = 0
####返回值 nil
####参见 - i2c.read()
i2c.address()
####描述 设置i2c地址以及读写模式。
####语法 i2c.address(id, device_addr, direction)
####参数 id=0
device_addr: 设备地址。
direction: i2c.TRANSMITTER:写模式;i2c. RECEIVER:读模式。
####返回值 true: 收到ack false:没有收到ack
####参见 - i2c.read()
i2c.write()
####描述 向i2c写数据。数据可以是多个数字, 字符串或者lua table。
####语法 i2c.write(id, data1, data2,...)
####参数 id=0
data: 数据可以是多个数字, 字符串或者lua table。
####返回值 number:成功写入的字节个数
####示例
i2c.write(0, "hello", "world")
####参见 - i2c.read()
i2c.read()
####描述 读取len个字节的数据。
####语法 i2c.read(id, len)
####参数 id=0
len: 数据长度。
####返回值 string:接收到的数据。
####示例
id=0 sda=1 scl=2 -- 初始化i2c, 将pin1设置为sda, 将pin2设置为scl i2c.setup(id,sda,scl,i2c.SLOW) -- 用户定义函数:读取地址dev_addr的寄存器reg_addr中的内容。 function read_reg(dev_addr, reg_addr) i2c.start(id) i2c.address(id, dev_addr ,i2c.TRANSMITTER) i2c.write(id,reg_addr) i2c.stop(id) i2c.start(id) i2c.address(id, dev_addr,i2c.RECEIVER) c=i2c.read(id,1) i2c.stop(id) return c end -- 读取0x77的寄存器0xAA中的内容。 reg = read_reg(0x77, 0xAA) print(string.byte(reg))
####参见 - i2c.write()
#uart 模块 ##常量 无
uart.setup()
####描述 设置uart的波特率,字节长度,校验,停止位,是否echo。
####语法 uart.setup( id, baud, databits, parity, stopbits, echo )
####参数 id = 0, 只支持一个串口
baud = 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400, 460800, 921600, 1843200, 2686400
databits = 5, 6, 7, 8。表示字节长度。
parity = 0(none)。
stopbits = 1(1 stopbit), 2(2 stopbit).
echo = 0(关闭回显)。
####返回值 返回波特率
####参见 -
uart.on()
####描述 设置uart的事件回调函数,目前支持"data"事件,表示uart收到了数据,以行为单位。
####语法 uart.on(method, function, [run_input])
####参数 method = "data", 表示uart接收到了数据
function 为回调函数,"data" 的回调函数签名为function(data) end
run_input: 0或1,0表示从uart输入的data不经过lua解释器执行,1表示输入的行会被送到lua解释器执行。
####返回值 nil
####示例
uart.on("data", function(data) print("receive from uart:", data) if data=="quit" then uart.on("data") end end, 0)
####参见 -
uart.write()
####描述 向串口写入数据。
####语法 uart.write( id, string1, string2... )
####参数 id = 0, 只支持一个串口
string1:需要写入的字符串。
####返回值 nil
####参见 -
#onewire 模块 ##常量 无
ow.setup()
####描述 将pin设置为one wire模式。
####语法 ow.setup(pin)
####参数 pin: 1~12, IO 编号。
####返回值 nil
####参见 -
ow.reset()
####描述 执行一次1-wire复位操作。
####语法 ow.reset(pin)
####参数 pin: 1~12, IO 编号
####返回值 number: 如果有器件响应返回1,如果没有器件响应或者总线被拉低超过250us返回0。
####参见 -
ow.skip()
####描述 发送一个1-wire“忽略rom”的命令,可以用来寻址总线上的所有器件。
####语法 ow.skip(pin)
####参数 pin: 1~12, IO 编号
####返回值 nil
####参见 -
ow.select()
####描述 发送一个1-Wire“选择rom”的命令,执行此函数前请务必先执行ow.reset()函数。
####语法 ow.select(pin,rom)
####参数 pin: 1~12, IO 编号
rom: 包含slave器件rom内容的8个字节长度的string。
####返回值 nil
####示例
-- 18b20 Example pin = 9 ow.setup(pin) count = 0repeat count = count + 1 addr = ow.reset_search(pin) addr = ow.search(pin) tmr.wdclr() until((addr ~= nil) or (count > 100)) if (addr == nil) then print("No more addresses.") else print(addr:byte(1,8)) crc = ow.crc8(string.sub(addr,1,7)) if (crc == addr:byte(8)) then if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then print("Device is a DS18S20 family device.") repeat ow.reset(pin) ow.select(pin, addr) ow.write(pin, 0x44, 1) tmr.delay(1000000) present = ow.reset(pin) ow.select(pin, addr) ow.write(pin,0xBE,1) print("P="..present) data = nil data = string.char(ow.read(pin)) for i = 1, 8 do data = data .. string.char(ow.read(pin)) end print(data:byte(1,9)) crc = ow.crc8(string.sub(data,1,8)) print("CRC="..crc) if (crc == data:byte(9)) then t = (data:byte(1) + data:byte(2) * 256) * 625 t1 = t / 10000 t2 = t % 10000 print("Temperature="..t1.."."..t2.."Centigrade") end tmr.wdclr() until false else print("Device family is not recognized.") end else print("CRC is not valid!") endend
####参见 -
ow.write()
####描述 向选定的slave写一个字节。
####语法 ow.write(pin, v, power)
####参数 pin: 1~12, IO 编号
v: 向slave器件发送的字节
power: 1,用于向寄生供电器件供电;0,不需要寄生供电。注意:请务必调用ow.depower()或者发起新的读写操作来取消寄生供电。
####返回值 nil
####参见 -
ow.write_bytes()
####描述 向选定的slave写多个字节。
####语法 ow.write_bytes(pin, buf, power)
####参数 pin: 1~12, IO 编号
buf: 向slave发送的多个字节的字符串
power: 1,用于向寄生供电器件供电;0,不需要寄生供电。注意:请务必调用ow.depower()或者发起新的读写操作来取消寄生供电。
####返回值 nil
####参见 -
ow.read()
####描述 从选定的slave读取一个字节。
####语法 ow.read(pin)
####参数 pin: 1~12, IO 编号
####返回值 从slave读取的一个字节。
####参见 -
ow.read_bytes()
####描述 从选定的slave读取多个字节。
####语法 ow.read_bytes(pin, size)
####参数 pin: 1~12, IO 编号
size: 需要从slave读取的字节的个数
####返回值 从slave返回的多个字节的字符串。
####参见 -
ow.depower()
####描述 取消向总线供电。仅需在ow.write()或者ow.write_bytes()中的'power=1' 且 不再进行读写slave的情况下使用。
####语法 ow.depower(pin)
####参数 pin: 1~12, IO 编号
####返回值 nil
####参见 -
ow.reset_search()
####描述 清除查找状态用于重新开始进行查找操作。
####语法 ow.reset_search(pin)
####参数 pin: 1~12, IO 编号
####返回值 nil
####参见 -
ow.target_search()
####描述 设置查找选项'family_code',用于在下次调用ow.search()时查找该'family_code'的器件。
####语法 ow.target_search(pin, family_code)
####参数 pin: 1~12, IO 编号
family_code: family_code字节
####返回值 nil
####参见 -
ow.search()
####描述 寻找下一个slave器件。
####语法 ow.search(pin)
####参数 pin: 1~12, IO 编号
####返回值 查找成功则返回slave器件的8个字节的rom code字符串;
查找失败则返回nil
####参见 -
ow.crc8()
####描述 计算Dallas Semiconductor的8位CRC, 用于与ROM或者暂存器中的内容进行比较。
####语法 ow.crc8(buf)
####参数 buf: 需要进行crc8计算的字符串
####返回值 crc结果字节
####参见 -
ow.check_crc16()
####描述 计算1-Wire的CRC16并与接收的CRC结果进行比较。
####语法 ow.check_crc16(buf, inverted_crc0, inverted_crc1, crc)
####参数 buf: 需要进行crc8计算的字符串
inverted_crc0: 接收到的CRC结果的低字节
inverted_crc1: 接收到的CRC结果的高字节
crc: crc初始值 (可选)
####返回值 布尔值: true, crc结果相符; false,crc结果不相符。
####参见 -
ow.crc16()
####描述 计算Dallas Semiconductor的16位的CRC值。用于1-wire总线中多器件通信的数据完整性校验。请注意:这里的CRC计算结果并不一定是1-wire总线中获得的CRC,原因如下:
1) 1-wire总线传输的CRC是低位先传输的。
2) 另外由于因处理器而异的字节顺序,ow.crc16()返回结果的MSB和LSB顺序可能不同于1-wire总线中获取的MSB和LSB顺序。
####语法 ow.crc16(buf, crc)
####参数 buf: 需要进行crc8计算的字符串
crc: crc初始值 (可选)
####返回值 返回16位的Dallas Semiconductor CRC计算结果
####参见 -
#spi 模块 ##常量 MASTER, SLAVE, CPHA_LOW, CPHA_HIGH, CPOL_LOW, CPOL_HIGH, DATABITS_8, DATABITS_16
spi.setup()
####描述 配置spi.
####语法 spi.setup( id, mode, cpol, cpha, databits, clock )
####参数 id: spi id号.
mode: MASTER 或者 SLAVE(目前不支持).
cpol: CPOL_LOW 或者 CPOL_HIGH, 时钟极性.
cpha: CPHA_HIGH 或者 CPHA_LOW, 时钟相位.
databits: DATABITS_8 或者 DATABITS_16.
clock: spi时钟 (目前不支持).
####返回值 number: 1.
####示例
####参见 -
spi.send()
####描述 向spi设备发送数据.
####语法 wrote = spi.send( id, data1, [data2], ..., [datan] )
####参数 id: spi id号.
data: data可以是字符串、Lua table或者8位数值.
####返回值 number: 发送数据的字节数.
####示例
####参见 -
spi.recv()
####描述 从spi设备接收数据.
####语法 read = spi.recv( id, size )
####参数 id: spi id号.
size: 需要读取数据的字节数.
####返回值 string: 读取的字符串(字节形式).
####示例
####参见 -
#mqtt 模块 ##常量
mqtt.Client()
####描述 创建一个mqtt client.
####语法 mqtt.Client(clientid, keepalive, user, pass)
####参数 clientid: mqtt客户端id.
keepalive: 保持连接的时间,单位:秒.
user: 用户名,字符串.
pass: 密码,字符串.
####返回值 mqtt客户端.
####示例
-- 创建一个mqtt client,保持连接包时间120s. m = mqtt.Client("clientid", 120, "user", "password") --设置Last Will和Testament (可选).--如果mqtt client不发送保持连接包,服务器会向标题"/lwt"发送一个qos = 0, retain = 0, data = "offline"的消息. m:lwt("/lwt", "offline", 0, 0) m:on("connect", function(con) print ("connected") end) m:on("offline", function(con) print ("offline") end) -- 接收到消息事件 m:on("message", function(conn, topic, data) print(topic .. ":" ) if data ~= nil then print(data) endend) -- 如果需要安全连接,则m:connect("192.168.11.118", 1880, 1) m:connect("192.168.11.118", 1880, 0, function(conn) print("connected") end) -- 订阅"/topic"消息,qos = 0 m:subscribe("/topic",0, function(conn) print("subscribe success") end) -- 向"/topic"标题发送消息,消息设置:data = hello, QoS = 0, retain = 0 m:publish("/topic","hello",0,0, function(conn) print("sent") end) m:close(); -- 或者可以再次调用m:connect()
####参见 -