再发一个串口控件sport.dll封装库和使用示例
By
admin
at 2020-07-04 • 2人收藏 • 2865人看过
提醒下:
aardio扩展库里已经有了串口通信用的的sio库 ,目前市面上的串口基本都是基于它 .
下面我写的这个sport库 , 完全是出于练习的目的, 当然串口操作多一种方式也挺好.
至于哪一个用起来效果更好? 额... 应该都差不多, 这个sport是com组件,不能跨线程.
这个串口控件是大名鼎鼎的虚拟串口提供商Eltima的另一个收费组件 , 额, 下面的是新鲜出炉的和谐版....
我本来是想要自己和谐下的, 可惜技艺不精, 这里鸣谢下看雪的大大youxiaxy
https://bbs.pediy.com/thread-260295.htm
废话不多说了, 下面是封装的库函数源码sport.aardio
//SPortAx串口库 import com.activeX; class sport{ ctor( name ){ this = ..com.CreateObject("SPort.SPortAx.1"); ..com.Connect(this,{ OnPortRemoved = function(name){ this.OnPortRemoved(name); }; OnPortAdded = function(name){ this.OnPortAdded(name); }; OnChangePortsList = function(){ this.OnChangePortsList(); }; OnRxChar = function(conut){ this.OnRxChar(conut); }; OnRxFlag = function(){ this.OnRxFlag(); }; OnCommEvent = function(Events){ this.OnCommEvent(Events); }; OnBreak = function(){ this.OnBreak(); }; OnTxEmpty = function(){ this.OnTxEmpty(); }; OnLatencyExpiry = function(){ this.OnLatencyExpiry(); }; }); if(name!=null and name!=""){ name = ..string.upper(name); this.Open(name); }; ..table.gc(this,function(){ this.Close(); }); return this; }; } namespace sport{ try{ ..com.CreateObject("SPort.SPortAx.1"); } catch(e){ ..com.activeX.regsvr32("\res\Sport.dll",true); } } /**intellisense() sport = sport串口控件 sport(.(端口号) = 创建串口控件\n参数:端口号\n当参数存在时直接打开串口 sport() = !sport. end intellisense**/ /**intellisense(!sport) Open(.(串口号) = 打开串口设备\n返回:true/false Close() = 关闭串口设备\n返回:true/false ReadStr() = 读取接收到的字符串\n返回:从串口接收到的字符串 WriteStr(.(字符串) = 发送字符串\n返回:发送成功的字节数 PurgeQueue() = 清空输入缓冲区数据\n返回:true/false GetPortName(.(序列号) = 通过序列号获取串口的端口名\n序列号从0开始计算\n端口总数可以由CountPorts属性获得 PortIsAvailable(.(串口号) = 判定串口是否可用 SetLatencyExpiry(.(毫秒) = 超时时间设置\n在设定时间内未接收到任何数据,则触发OnLatencyExpiry超时事件\n如果设置为0,则永远不会触发OnLatencyExpiry超时事件 Databits = 设置或获取 数据位\n值:5,6,7,8 Parity = 设置或获取 校验位\n值:0=No parity\n1=odd\n2=Event\n3=mark\n4=space StopBits = 设置或获取 停止位\n值:0=1 stop bit\n1=1,5 stop bit\n2=2 stop bit FullDeviceName = 获取当前串口的友好名称(全名) MonitorEvents = 设置或获取 串口监听事件\nRXCHAR = 1\nRXFLAG = 2\nTXEMPTY = 4\nBREAK = 64\nEVENT1 = 2048\nEVENT2 = 4096 InCount = 获取输入缓冲区字节数 OutCount = 获取输出缓冲区字节数 BaudRate = 设置或获取 波特率\n值:110,300,600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200,128000,256000 IsOpened = 获取当前串口的状态 InBufferSize = 获取或设置设备内部输入缓冲区的建议大小(以字节为单位) OutBufferSize = 获取或设置设备内部输出缓冲区的建议大小(以字节为单位) Break = 设置Break属性会暂停指定通信设备的字符传输,并将传输线置于break状态(作用于输入)。 CountPorts = 获取串口设备数量 BlockMode = 设置或获取 阻塞模式 EnableAutoDetectPorts = 设置为true,如果串行端口列表发生更改,将调用OnPortAdded,OnPortRemoved和OnChangePortsList事件 OnCommEvent() = @.OnCommEvent = function(Events){ __/*每当发生通信事件时,都会触发*/ } OnRxChar(count) = @.OnRxChar = function(count){ __/*当接收缓冲区有数据插入时触发\n参数 count 当前可读取的字节数*/ } OnBreak() = @.OnBreak = function(){ __/*当在接收到的输入中检测到中断信号时触发*/ } OnTxEmpty() = @.OnTxEmpty = function(){ __/*发送缓冲区为空,表示所有数据均已发送时触发*/ } OnRxFlag() = @.OnRxFlag = function(){ __/*接收到事件字符并将其放置在输入缓冲区中时触发*/ } OnLatencyExpiry() = @.OnLatencyExpiry = function(){ __/*如果在由SetLatencyExpiry方法设置的时间段内未接收到数据时触发*/ } OnPortAdded(Port) = @.OnPortAdded = function(Port){ __/*如果将EnableAutoDetectPorts属性设置为TRUE,则将新的串行端口添加到系统时触发*/ } OnPortRemoved(Port) = @.OnPortRemoved = function(Port){ __/*如果将EnableAutoDetectPorts属性设置为TRUE,则串口设备从系统中移除时触发*/ } OnChangePortsList() = @.OnChangePortsList = function(){ __/*如果将EnableAutoDetectPorts属性设置为TRUE,则串行端口列表更改时触发*/ } end intellisense**/
使用方法如下:
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程3";right=377;bottom=107) mainForm.add( button={cls="button";text="write";left=244;top=35;right=339;bottom=72;z=1}; edit={cls="edit";text="demo aardio";left=36;top=39;right=237;bottom=68;edge=1;multiline=1;z=2} ) /*}}*/ import console console.open() import sport; var spo = sport(); console.log( spo.Open("COM1") ); spo.BaudRate = 9600; spo.Databits = 8; spo.Parity = 0; spo.StopBits = 0; spo.MonitorEvents = 1; spo.OnRxChar = function(count){ console.log(count,spo.ReadStr()) } spo.OnCommEvent = function(Events){ console.log("Events",Events) } mainForm.button.oncommand = function(id,event){ console.log(spo.WriteStr(mainForm.edit.text)) } mainForm.show(); return win.loopMessage();
下载连接↓↓↓↓↓:
由于我是通过虚拟串口来进行的测试, 所以很多属性和事件都没测试, 有用到的朋友如果测试了, 还请留言让我知道下是不是有bug.
3 个回复 | 最后更新于 2023-12-29
登录后方可回帖
调用 WriteStr,遇到 \x00 会被截断;
调用 WriteVariant,会每个字节发送一次,不合适;
调用 Write,提示参数不匹配(使用 raw.buffer 创建的参数);
请问如何发送二进制数据?