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.

####示例

####参见 -

- Back to Index

spi.send()

####描述 向spi设备发送数据.

####语法 wrote = spi.send( id, data1, [data2], ..., [datan] )

####参数 id: spi id号.

data: data可以是字符串、Lua table或者8位数值.

####返回值 number: 发送数据的字节数.

####示例

####参见 -

- Back to Index

spi.recv()

####描述 从spi设备接收数据.

####语法 read = spi.recv( id, size )

####参数 id: spi id号.

size: 需要读取数据的字节数.

####返回值 string: 读取的字符串(字节形式).

####示例

####参见 -

- Back to Index

#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()

####参见 -

- Back to Index