串口-comX,comusb0

描述

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

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

  ScriptMode UserDefine PassThrough PassThrough_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控件来接收文件或者图片

事件

  • receive: 接收到串口数据时触发(只对UserDefine协议有效,ScriptMode协议不会产生该事件),事件函数定义:onReceive(count), count为串口接收缓冲区内的未读出数据字节数。
  • send:发送完一次(调用write()或者writeString()一次)串口数据时触发,事件函数定义:onSend(count),count为串口已发送数据的字节数。
  • event: 串口事件上报,事件函数定义:onEvent(event)事件类型有Event_ReceiveTimeout(接收超时), Event_ReceiveOverflow(接收缓冲溢出)

属性

名称 功能说明 脚本例子
protocol 通讯协议:脚本模式( ScriptMode )协议,用户自定义( UserDefine)协议。WeStudio1.6.2版本之前的Modbus协议已不再支持,请直接使用Modbus控件
rate 波特率:支持常用波特率,默认值为115200,最大值为4000000 device.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为编格式,默认为utf8 device.com0.writeString('This is a test') 向串口写入字符串'This isa 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() 清空串口接收缓冲区

results matching ""

    No results matching ""