再发一个串口控件sport.dll封装库和使用示例
By
admin
at 2020-07-04 • 2人收藏 • 3244人看过
提醒下:
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 创建的参数);
请问如何发送二进制数据?