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

By admin at 2020-07-04 • 2人收藏 • 2787人看过

提醒下:

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.

3 个回复 | 最后更新于 2023-12-29
2023-12-25   #1

调用 WriteStr,遇到 \x00 会被截断;

调用 WriteVariant,会每个字节发送一次,不合适;

调用 Write,提示参数不匹配(使用 raw.buffer 创建的参数);


请问如何发送二进制数据?

2023-12-26   #2

测试发现,Write 的第一个参数,在 VB 中,给首字节。

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...