串口-comX,comusb0
描述
串口,异步全双工串口对象,可实现串口数据的接收和发送,父对象为device.io,无子对象。目前Pi支持3个板载串口(Pi- Pro支持4个板载串口)以及一个usb串口,名称分别为com0,com1,com2,com3,comusb0。以下说明以com0为例,com1,com2,com3和comusb0同样适用。
[注意]串口控件默认是未使能,必须先使能(enabled属性)才能正常使用
通讯协议:支持脚本模式( ScriptMode )和用户自定义( UserDefine ),透传(PassThrough),接收透传(PassThrough_Rx),默认为UserDefine。在运行时只能选择其中一种,各个协议的比较见下表
ScriptMode | UserDefine | PassThrough | PassThrough_Rx | |
---|---|---|---|---|
数 据 发 送 | 可选择以下两种方式中的一种或两种混合使用: -自动发送:在设计APP时,选中某个控件的属性中的”事件通知”(verbose),APP在运行过程中,当对象事件(该事件需在动作列表中选中)产生时,ExpOS自动发送事件消息,无需用户编写任何脚本;如开机后系统准备完毕会自动下发E+device.onBootDone()\r:页面main中名字为xx的按钮按下一次,ExpOS自动向串口发送"ui.main.xx.onPress()"字符串;-主动发送:不选择“事件通知”属性,与自定义协议发送方式一致 | 在任意脚本中直接调用 write() 或者 writeString() 函数,实现主动发送任意自定义数据或者字符串。用户需编写发送处理程序。 | 透传,数据发送不经过串口控件,直接由另外的控件写串口。主要应用场景是使用Modbus控件并选择RTU协议 | 不透传,数据发送由串口控件操作 |
数 据 接 收 | 外部控制单元发送有效的JavaScript脚本程序字符串,ExpOS接收后自动执行。如:外部控制单元向串口发送”ui.main.xx.text=‘test’“字符串(后必须加回车字符),页面main中名字为xxx的控件文本内容自动刷新为“test”。任何有效的脚本程序都能通过通讯接口以字符串方式发送给ExpOS立即执行。用户无需编写接收处理程序 。 | 在device.io.com0的onReceive(count)事件动作脚本里调用read()函数读取有效串口数据。ExpOS根据设置好的阀值、帧头和帧尾等属性,自动接收串口数据放入缓冲区并按指定条件触发onReceive(count)动作脚本执行,完成数据读取。用户需编写接收处理程序。 | 透传,数据接收不经过串口控件,直接由另外的控件读串口。主要应用场景是使用Modbus控件并选择RTU协议 | 透传,数据接收不经过串口控件,直接由另外的控件读串口。主要应用场景是使用Stream控件来接收文件或者图片 |
事件
- receive: 接收到串口数据时触发(只对UserDefine协议有效,ScriptMode协议不会产生该事件),事件函数定义:onReceive(count), count为串口接收缓冲区内的未读出数据字节数。
- send:发送完一次(调用write()或者writeString()一次)串口数据时触发,事件函数定义:onSend(count),count为串口已发送数据的字节数。
- event: 串口事件上报,事件函数定义:onEvent(event)事件类型有Event_ReceiveTimeout(接收超时), Event_ReceiveOverflow(接收缓冲溢出)
属性
名称 | 功能说明 | 脚本例子 |
---|---|---|
enabled | 使能,默认值为false | device.io.com0.enabled = true; // 使能串口0 |
protocol | 通讯协议:脚本模式( ScriptMode )协议,用户自定义( UserDefine)协议。WeStudio1.6.2版本之前的Modbus协议已不再支持,请直接使用Modbus控件。 | 无 |
rate | 波特率:支持常用波特率,默认值为115200,最大值为4000000 | device.io.com0.rate='9600' 设置波特率为9600 |
dataBits | 数据位,默认值为8 | 无 |
stopBits | 停止位,默认值为1 | 无 |
parity | 校验位,0-None(无校验), 1-Odd(奇校验), 2-Even(偶校验), 3-Mark(1校验), 4-Space(0校验), 默认值为0-None | 无 |
scriptModeReply | 只适用ScriptMode协议, 自动回复:如果为true,ExpOS收到脚本后,自动回复字符串"C+"表示执行成功,“C-”表示执行失败 | 无 |
threshold | 只适用UserDefine协议,接收事件触发门限值:当收到新数据,而且接收缓冲区未读字节数等于或者大于此值,触发onReceive事件 | device.io.com0.threshold=10 设定接收缓冲区字节未读字节数等于或者大于10时触发onReceive事件 |
headEnabled | 只适用UserDefine协议,帧头字节检测使能:如果为true,ExpOS自动在接收缓冲区查找head属性指定的字节,如果找到,触发onReceive事件 | device.io.com0.headEnabled=1 使能帧头字节检测功能 |
head | 只适用UserDefine协议 ,帧头字节定义,输入16进制字符串,如3A表示0x3A,只有headEnabled为true时才有效,多个字节使用空格分隔,如'3A 3B' | device.io.com0.head=‘3A 3B' 设置待检测的帧头为0x3A 0x3B |
tailEnabled | 只适用UserDefine协议,帧尾字节检测使能:如果为true,ExpOS自动在接收缓冲区查找head和tail属性指定的字节,如果同时找到,触发onReceive事件 | device.io.com0.tailEnabled=1 使能帧尾字节检测功能 |
tail | 只适用UserDefine协议 ,帧尾字节定义,输入16进制字符串,如1D表示0x1D, 多个字节使用空格分隔,如'1D 1D' | device.io.com0.tail='1D 1D' 设置待检测的帧尾为0x1D 0x1D |
timeoutEnabled | 使能超时 | 无 |
receiveTimeout | 接收超时,单位毫秒,超时会通过event上报,调用串口对象的onEvent(event)方法 | 无 |
receiveEncoding | ScriptMode协议时的编码格式,默认值为UTF-8 | 无 |
方法
名称 | 功能说明 | 脚本例子 |
---|---|---|
isSupported() | 查询是否支持串口设备,返回布尔值 | var supported = device.io.com3.isSupported() 查询是否支持com3设备 |
write(data) | 写串口:参数可以是字符串(‘abc'),也可以是数组([0x61, 0x62, 0x63]),也可以是多个16进制数,或者是以空格分隔的16进制字符串(如 '61 62 63') | device.io.com0.write('abc') device.io.com0.write(['a', 'b', 'c']) device.io.com0.write(0x61, 0x62, 0x63) device.io.com0.write('61 62 63') 向串口写入16进制流 61 62 63 |
writeInt16(data) | 向串口写整型(16位),data为数值或数组,字节顺序为小端 | device.io.com0.writeInt16(0x1234) 向串口写入16进制流 34 12 |
writeInt16(data,isBigEndian) | 向串口写整型(16位),data为数值或数组,isBigEndian表示是否大端 | device.io.com0.writeInt16(0x1234, true) 向串口写入16进制流 12 34 |
writeInt32(data) | 向串口写整型(32位),data为数值或数组,字节顺序为小端 | device.io.com0.writeInt16(0x12345678) 向串口写入16进制流 78 56 34 12 |
writeInt32(data,isBigEndian) | 向串口写整型(32位),data为数值或数组,isBigEndian表示是否大端 | device.io.com0.writeInt16(0x12345678, true) 向串口写入16进制流 12 34 56 78 |
writeString(string, encoding) | 向串口写字符串: 参数string为字符串,encoding为编格式,默认为utf8 | device.io.com0.writeString('This is a test') 向串口写入字符串'This isa test',编码格式为utf8 device.io.com0.writeString('测试', 'gb2312') 向串口写入字符串'测试',编码格式为gb2312 |
readableBytes() | 串口接收缓冲区中可读字节数 | var count = device.io.com0.readableBytes() 读取接收缓冲区中可读字节数 |
readableFrames() | 串口接收缓冲区中可以读的帧数(仅适用于设置了串口属性帧头(head)或者帧尾(tail),或者两个属性都设置了) | var count = deviceo.com0.readableFrames() 读取接收缓冲区中可读帧数 |
read() read(length) read(length, peek) |
读串口:不带参数表示读取所有数据并清空缓冲区,参数length表示读取的字节数,参数peek表示是否在接收缓冲区中删除读过的数据;注意:如果属性设置了帧头(head)或者帧尾(tail),读取到的数据不包含头和尾,只会包含有效字节,另外需要判断readableFrames()读取所有帧,防止数据帧被覆盖或丢失,因为可能在onReceive回调的时候已经接收到了好几帧数据。 | var a = []; a = device.io.com0.read(2) 从串口接收缓冲区读取两个字节并存如数组a中,读完后在接收缓冲区中删除这两个字节 var a = []; a = device.io.com0.read(2, true) 从串口接收缓冲区读取两个字节并存如数组a中,读完后在仍然保留这两个字节在接收缓冲区中 var a = []; a = device.io.com0.read() 从串口接收缓冲区读取所有字节并存如数组a中,读完后清空接收缓冲区 |
clearReadBuffer() | 清空接缓冲区。如果调用read()时不带参数,默认会清空缓冲,则不需要再调用clearReadBuffer() | device.io.com0.clearReadBuffer() 清空串口接收缓冲区 |
saveSerialPortConfig() | 保存当前串口参数到系统环境,设备重启后仍然生效 | device.io.com0.saveSerialPortConfig() 保存当前串口参数到系统环境 |
resetSerialPortConfig | 恢复串口参数到工程初始设置值,设备重启后仍然生效 | device.io.com0.resetSerialPortConfig() 重置串口参数为工程初始设置 |
reload() | 重新加载串口参数初始化串口, 适用于修改了串口参数后 | device.io.com0.reload() 重新加载串口参数并初始化串口 |