Skip to content

串口-com0~com3,comusb0

描述


串口,异步全双工串口对象,可实现串口数据的接收和发送,父对象为device,无子对象。目前Pi支持3个板载串口(Pi-Pro支持4个板载串口)以及一个usb串口,名称分别为com0,com1,com2,com3,comusb0。以下说明以com0为例,com1,com2,com3和comusb0同样适用。

通讯协议:支持脚本模式(ScriptMode)和用户自定义(UserDefine),透传(PassThrough),接收透传(PassThrough_Rx),默认为UserDefine。在运行时只能选择其中一种,各个协议的比较见下表

ScriptModeUserDefinePassThroughPassThrough_Rx
数 据 发 送
可选择以下两种方式中的一种或两种混合使用: – 自动发送:在设计APP时,选中某个控件的属性中的”事件通知”(verbose),APP在运行过程中,当对象事件(该事件需在动作列表中选中)产生时,ExpOS自动发送事件消息,无需用户编写任何脚本;如:页面main中名字为xx的按钮按下一次,ExpOS自动向串口发送"ui.main.xx.onPress()"字符串; -主动发送:不选择“事件通知”属性,与自定义协议发送方式一致在任意脚本中直接调用device.com0.write()或者device.com0.writeString()函数,实现主动发送任意自定义数据或者字符串。用户需编写发送处理程序。透传,数据发送不经过串口控件,直接由另外的控件写串口。主要应用场景是使用Modbus控件并选择RTU协议不透传,数据发送由串口控件操作
数 据 接 收
外部控制单元发送有效的JavaScript脚本程序字符串,ExpOS接收后自动执行。如:外部控制单元向串口发送”ui.main.xx.text=‘test’“字符串(后必须加回车字符),页面main中名字为xxx的控件文本内容自动刷新为“test”。任何有效的脚本程序都能通过通讯接口以字符串方式发送给ExpOS立即执行。用户无需编写接收处理程序在device.com0的onReceive(count)事件动作脚本里调用device.com0.read()函数读取有效串口数据。ExpOS根据设置好的阀值、帧头和帧尾等属性,自动接收串口数据放入缓冲区并按指定条件触发onReceive(count)动作脚本执行,完成数据读取。用户需编写接收处理程序。透传,数据接收不经过串口控件,直接由另外的控件读串口。主要应用场景是使用Modbus控件并选择RTU协议透传,数据接收不经过串口控件,直接由另外的控件读串口。主要应用场景是使用Stream控件来接收文件或者图片

事件


onReceive: 接收到串口数据时触发(只对UserDefine协议有效,ScriptMode协议不会产生该事件),事件函数定义:onReceive(count), count为串口接收缓冲区内的未读出数据字节数。

onSend:发送完一次(调用write()或者writeString()一次)串口数据时触发,事件函数定义:onSend(count), count为串口已发送数据的字节数。

onEvent(event): 串口事件上报,事件类型有Event_ReceiveTimeout(接收超时), Event_ReceiveOverflow (接收缓冲溢出)

属性


名称功能说明脚本例子
protocol通讯协议:脚本模式(ScriptMode)协议,用户自定义(UserDefine)协议。WeStudio1.6.2版本之前的Modbus协议已不再支持,请直接使用Modbus控件
rate波特率:支持常用波特率,默认值为115200,最大值为4000000device.com0.rate='9600' 设置波特率为9600
scriptModeReply只适用ScriptMode协议,自动回复:如果为true, ExpOS收到脚本后,自动回复字符串"C+"表示执行成功,“C-”表示执行失败
threshold只适用UserDefine协议,接收事件触发门限值:当收到新数据,而且接收缓冲区未读字节数等于或者大于此值,触发onReceive事件device.com0.threshold=10 设定接收缓冲区字节未读字节数等于或者大于10时触发onReceive事件
headEnabled只适用UserDefine协议,帧头字节检测使能:如果为true,ExpOS自动在接收缓冲区查找head属性指定的字节,如果找到,触发onReceive事件device.com0.headEnabled=1 使能帧头字节检测功能
head只适用UserDefine协议,帧头字节定义,输入16进制字符串,如3A表示0x3A,只有headEnabled为true时才有效, 多个字节使用空格分隔,如'3A 3B'device.com0.head=‘3A 3B' 设置待检测的帧头为0x3A 0x3B
tailEnabled只适用UserDefine协议,帧尾字节检测使能:如果为true,ExpOS自动在接收缓冲区查找head和tail属性指定的字节,如果同时找到,触发onReceive事件device.com0.tailEnabled=1 使能帧尾字节检测功能
tail只适用UserDefine协议,帧尾字节定义,输入16进制字符串,如1D表示0x1D, 多个字节使用空格分隔,如'1D 1D'device.com0.tail='1D 1D' 设置待检测的帧尾为0x1D 0x1D

方法


名称功能说明脚本例子
isSupported()查询是否支持串口设备,返回布尔值var supported = device.com3.isSupported() 查询是否支持com3设备
write(data)写串口:参数可以是字符串(‘abc'),也可以是数组([0x61, 0x62, 0x63]),也可以是多个16进制数,或者是以空格分隔的16进制字符串(如 '61 62 63')device.com0.write('abc') device.com0.write(['a', 'b', 'c']) device.com0.write(0x61, 0x62, 0x63) device.com0.write('61 62 63') 向串口写入16进制流  61 62 63
writeInt16(data)向串口写整型(16位),data为数值或数组,字节顺序为小端
device.com0.writeInt16(0x1234) 向串口写入16进制流 34 12
writeInt16(data,isBigEndian)向串口写整型(16位),data为数值或数组,isBigEndian表示是否大端device.com0.writeInt16(0x1234, true) 向串口写入16进制流 12 34
writeInt32(data)向串口写整型(32位),data为数值或数组,字节顺序为小端device.com0.writeInt16(0x12345678) 向串口写入16进制流 78 56 34 12
writeInt32(data,isBigEndian)向串口写整型(32位),data为数值或数组,isBigEndian表示是否大端device.com0.writeInt16(0x12345678, true) 向串口写入16进制流 12 34 56 78
writeString(string, encoding)向串口写字符串: 参数string为字符串, encoding为编格式,默认为utf8device.com0.writeString('This is a test') 向串口写入字符串'This is a test',编码格式为utf8 device.com0.writeString('测试', 'gb2312') 向串口写入字符串'测试',编码格式为gb2312
readableBytes()
串口接收缓冲区中可读字节数
var count = device.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.com0.read(2) 从串口接收缓冲区读取两个字节并存如数组a中,读完后在接收缓冲区中删除这两个字节
var a = []; a = device.com0.read(2, true) 从串口接收缓冲区读取两个字节并存如数组a中,读完后在仍然保留这两个字节在接收缓冲区中
var a = []; a = device.com0.read() 从串口接收缓冲区读取所有字节并存如数组a中,读完后清空接收缓冲区
clearReadBuffer()清空接缓冲区。如果调用read()时不带参数,默认会清空缓冲,则不需要再调用clearReadBuffer()
device.com0.clearReadBuffer() 清空串口接收缓冲区