分享一个ZylSerialPortAXControl.ocx串口控件

By admin at 2021-02-18 • 1人收藏 • 1048人看过

无聊河蟹了个串口控件, 其实没啥用, 网上瞎逛看到的. 

我们都有sio控件和其他一些dll可以使用了, 看看就算了.

这里发出来给喜欢折腾的人吧

ZylSerialPortAX.zip


此控件支持com.lite免注册调用


image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=540;bottom=205)
winform.add(
button={cls="button";text="打开COM1";left=19;top=37;right=175;bottom=98;dl=1;dt=1;z=1};
button2={cls="button";text="关闭串口";left=19;top=126;right=175;bottom=187;db=1;dl=1;z=2};
edit={cls="edit";left=192;top=36;right=526;bottom=187;border=1;db=1;dl=1;dr=1;dt=1;multiline=1;z=3};
static={cls="static";text="接受到:";left=192;top=10;right=315;bottom=37;border=1;center=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-16);transparent=1;z=4}
)
/*}}*/

import console
console.open()

import com.lite;
var dll = com.lite.appData("\popdes\ZylSerialPortAXControl.ocx",$"\res\ZylSerialPortAXControl.ocx");
var ZylSerialPortAX = dll.createObject("{F66B5918-ACF6-49D3-86A4-FEF1003E4E22}"); 

com.Connect(ZylSerialPortAX,{
	OnReceive = function(str){
		ZylSerialPortAX.OnReceive(str);
	}
});

ZylSerialPortAX.OnReceive = function(str){
	console.log(str)
	winform.edit.log( str,'\r\n' )
}

winform.button.oncommand = function(id,event){
	ZylSerialPortAX.Port = 1
    ZylSerialPortAX.Open()
}

winform.button2.oncommand = function(id,event){
	ZylSerialPortAX.Close();
}

winform.show();
win.loopMessage();


3 个回复 | 最后更新于 2 天前
2021-07-14   #1

感谢: indertust 封装并分享此调用库 , 库代码如下:

class ZylSerial{
	ctor(){
		this.rxCount = 0;
		this.txCount = 0;
		this.rxBytes = 0;
		this.txBytes = 0;
		this.eventConnected = false;
	};
	
	open = function(portName='COM1', baudRate=9600, dataWidth=8, parityBits='n', stopBits='1'){
		this.port, this.info = open(portName, baudRate, dataWidth, parityBits, stopBits)
		//.._p('this.info', this.info)
		return this.port, this.info
	}
	
	sendString = function(str){
		if((this.port != 0) and (type(str) == type.string) and (#str > 0)){
			this.txCount++
			this.txBytes += #str
			this.rxData = str
			return sendString(str)
		}
	}
	
	sendByte = function(byte){
		if((this.port != 0) and (type(byte) == type.number) and (byte >= 0) and (byte <= 255)){
			this.txCount++
			this.txBytes += 1
			return sendByte(byte)
		}
	}
	
	sendHex = function(str){
		if((this.port != 0) and (type(str) == type.string) and (#str > 0)){
			var byte
			
			for(i=1;#str;1){
				byte = str[i]
				sendByte(byte)
			}
			
			this.txCount++
			this.txBytes += #str
			
			return #str
		}
	}
	
	
	resetCounts = function(){
		this.rxCount = 0;
		this.txCount = 0;
		this.rxBytes = 0;
		this.txBytes = 0;
	}
	
	close = function(){
		if(this.port != 0){
			close()
		}
	}
	
	about = function(){
		if(ready){
			ZylSerialPortAX.AboutBox()
		}
	}
	
	isConnected = function(){
		if(ready){
			this.port = ZylSerialPortAX.IsConnected()
			return this.port
		}
	}

	SetOnReceiveCallbackFunction = function(fun){
		if(ZylSerialPortAX.IsConnected() and (type(fun) == type.function)){
			ZylSerialPortAX.OnReceive = function(str){
				fun(str)
			}
			
			if(this.eventConnected == false){
				com.Connect(ZylSerialPortAX,{
    				OnReceive = function(str){
    					this.txData = str
						this.rxCount++
						this.rxBytes += #str
        				ZylSerialPortAX.OnReceive(str);
    				}
				});
				
				this.eventConnected = true
			}
		}
	}
}

namespace ZylSerial{
	import com.lite;
	import io;
	string = ..string;
	
	ParityBitsValue = {
		None = 0;
		Odd = 1;
		Even = 2;
		Mark = 3;
		Space = 4;
		none = 0;
		odd = 1;
		even = 2;
		mark = 3;
		space = 4;
		n = 0;
		o = 1;
		e = 2;
		m = 3;
		s = 4;
		N = 0;
		O = 1;
		E = 2;
		M = 3;
		S = 4;
	};
	
	DataWidthValue = {
		[0] = -5;
		[1] = -4;
		[2] = -3;
		[3] = -2;
		[4] = -1;
		[5] = 0;
		[6] = 1;
		[7] = 2;
		[8] = 3;
		['5'] = 0;
		['6'] = 1;
		['7'] = 2;
		['8'] = 3;
	};
	
	StopBitsValue = {
		[1] = 0;
		[2] = 2;
		['1'] = 0;
		['1.5'] = 1;
		['2'] = 2;
	};
	
	getBaudRateValue = function(baudrate){
		var baudRateValue = 6;
		
		select(baudrate) {
			case 110 {
				baudRateValue = 0
			}
			case 300 {
				baudRateValue = 1
			}
			case 600 {
				baudRateValue = 2
			}
			case 1200 {
				baudRateValue = 3
			}
			case 2400 {
				baudRateValue = 4
			}
			case 4800 {
				baudRateValue = 5
			}
			case 9600 {
				baudRateValue = 6
			}
			case 14400 {
				baudRateValue = 7
			}
			case 19200 {
				baudRateValue = 8
			}
			case 38400 {
				baudRateValue = 9
			}
			case 57600 {
				baudRateValue = 10
			}
			case 115200 {
				baudRateValue = 11
			}
			case 128000 {
				baudRateValue = 12
			}
			case 256000 {
				baudRateValue = 13
			}
			case 460800 {
				baudRateValue = 14
			}
			case 921600 {
				baudRateValue = 15
			}	
		}
		
		return baudRateValue
	}
	
	
	getErrorInfo = function(es){
		var errInfo = string.match(es, "<@@{Error}:@>([^{]+)")
		return tostring(errInfo)
	}
	
	
	parsePortName = function(portName = 'COM1'){
		var portNumber = string.match(portName, "\d+")
		return tonumber(portNumber)
	}

	//var dll = com.lite.appData("\ZylSerialPortAXControl.ocx",$"\res\ZylSerialPortAXControl.ocx");
	if(io.exist("\ZylSerialPortAXControl.ocx")){
		dll = com.lite("\ZylSerialPortAXControl.ocx")
		
		if(dll){
			ZylSerialPortAX = dll.createObject("{F66B5918-ACF6-49D3-86A4-FEF1003E4E22}");	
		}
		
		if(ZylSerialPortAX){
			ready = true
		}
	}
	
	if(ready){
		about = function(){
			ZylSerialPortAX.AboutBox()
		}
		
		open = function(portName='COM1', baudRate=9600, dataWidth=8, parityBits='n', stopBits='1'){
			ZylSerialPortAX.Port = parsePortName(portName)
			ZylSerialPortAX.BaudRate = getBaudRateValue(baudRate)
			ZylSerialPortAX.DataWidth = DataWidthValue[dataWidth]
			ZylSerialPortAX.Parity = ParityBitsValue[parityBits]
			ZylSerialPortAX.StopBits = StopBitsValue[stopBits]
			
			if(ZylSerialPortAX.IsConnected()){
				ZylSerialPortAX.Close()
			}

			var info = 'ok'
			
			try{
				ZylSerialPortAX.Open()
			}catch(e){
				//在这里 return 只会跳出 try 块,并不会从本函数返回,所以需要域外变量传过去返回
				//return ZylSerialPortAX.IsConnected(), getErrorInfo(e)
				info = getErrorInfo(e)
			}
			
			return ZylSerialPortAX.IsConnected(), info
		}
		
		sendString = function(str){
			if((type(str) == type.string) and (#str >= 0)){
				if(ZylSerialPortAX.IsConnected()){
					return ZylSerialPortAX.SendString(str)
				}
			}
		}
		
		sendByte = function(byte){
			if((type(byte) == type.number) and (byte >= 0) and (byte <= 255)){
				if(ZylSerialPortAX.IsConnected()){
					return ZylSerialPortAX.SendByte(byte)
				}
			}
		}
		
		close = function(){
			ZylSerialPortAX.Close()
		}
		
		
	}
}

/**intellisense()
ZylSerial = ZylSerial 串口库
ZylSerial() = !ZylSerial.
end intellisense**/

/**intellisense(!ZylSerial)
open(portname, baudrate, datawidth, paritybits, stopbits) = 打开串口
sendString(str) = 发送字符串,返回已发送数据长度
sendHex(str) = 发送 16 进制字符串,返回已发送数据长度
sendByte(byte) = 发送字节(数值: 0~255)
SetOnReceiveCallbackFunction(fun) = 设置接收回调函数,必须在调用 open 之后,只能设置一次,内部已禁止多次调用
close() = 关闭串口
about() = 显示关于窗口
resetCounts() = 复位包和字节计数
rxCount = 接收包数
txCount = 发送包数
rxBytes = 接收字节数
txBytes = 发送字节数
rxData = 最后一次接收的数据
txData = 最后一次发送的数据
port = 当前打开的串口
isConnected() = 串口是否已连接,如果是,则返回串口编号,否则,返回 0
end intellisense**/


2022-06-19   #2

学习了

2 天前   #3

这个封装的怎么用法呢,才接触问些小白的问题,不好意思

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...