再发一个串口控件sport.dll封装库和使用示例

By admin at 2020-07-04 • 0人收藏 • 354人看过

提醒下:

aardio扩展库里已经有了串口通信用的的sio库 ,目前市面上的串口基本都是基于它 . 


下面我写的这个sport库 , 完全是出于练习的目的, 当然串口操作多一种方式也挺好.

至于哪一个用起来效果更好? 额... 应该都差不多, 这个sport是com组件,不能跨线程.

image.png

这个串口控件是大名鼎鼎的虚拟串口提供商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();

下载连接↓↓↓↓↓:

sportAx串口示例.zip


由于我是通过虚拟串口来进行的测试, 所以很多属性和事件都没测试, 有用到的朋友如果测试了, 还请留言让我知道下是不是有bug.

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...