快速开发基于ComXYZ控件的串口通信程序

来源:互联网 发布:vba抓取网页数据 编辑:程序博客网 时间:2024/05/17 01:06

1、概述

基于PC的串口通信方法通常有,WIN APIMSCOM控件,SerialPort控件等,现在这里要介绍的是ComXYZ三个控件,使用这个三个控件均能快速开发出你的串口通信上位机程序。优点1:速度快,优点2:速度快,优点3:速度快。只需简单的串口配置,或者不需配置(ComZ时),仅仅需要调用控件提供的发送接收函数即可,无需考虑是中文发送还是英文ASCII发送,也不需要考虑ASCII发送还是16进制发送,它们均已封装在控件里,你只需在调用发送函数时指定是16进制发送还是ASCII发送;接收部分也已经封装好,你只需写一个线程查询是否有接收到数据,再决定你需要的数据格式,控件提供了,16进制数组---用于数据分析(分析数据之前可强制清空缓存),16进制ASCII模式(数据之间自动插入一个空格)---用于显示,字符串模式---用于显示或者分析。

2、关于ComXYZ

2.1、获取控件文件

2.1.1、下载地址:暂无

由于上传图片遇到点难题:同文已发布到“百度文库”,欢迎查看

https://wenku.baidu.com/view/9688944da55177232f60ddccda38376baf1fe099

2.1.2、请加QQ321903608(获取新版(ComXYZ.DLL)控件库)

ComXYZ - 控件库文件及其测试例子.rar

2.2、开发环境

基于VS2010/2的串口通信程序,语言:c#(本人验证及开发它的环境,其他环境请自行验证)

2.3ComXYZ控件关系

2.3.1ComX

作为整个控件的母亲,包含了ComYComZ的全部代码,也是最早的一个复合控件。(不再更新,不推荐使用)

2.3.2ComY

ComX进行简化,去除界面元素,仅保留必要的通信功能,当需要个性化的串口配置显示方式时使用。仅需进行必要的串口配置即可。

2.3.3ComZ

ComY增加一个可视界面的封装,可见界面与ComX一个样子,但代码已经不一样。不需要个性化的配置界面推荐使用。

2.4、添加ComXYZ控件到工具箱

2.4.1、新建WINFORM工程(我这里是在现在解决方案里面添加一个工程)


完成之后如下图


2.4.2、添加控件到工具箱中

在上图工具箱的左下角常规里点击鼠标右键,选择弹出菜单的“选择项”弹出如下图对话框


点击红圈的浏览按钮,添加下载的控件文件ComXYZ.DLL


如下图所示


确保选择上图的1 2 3三个控件,之后点击确定按钮,工具箱如下图所示


由图可见3个控件已经添加到工具箱的常规选项卡中。之前它们的使用方法和软件自带的其他控件一样的使用方法。添加ComZ的运行效果如下图。


3、第一个例子(ComY

3.1、新建项目TestComY,并拖放如下控件/组件并定义其名称如下表。

序号

控件类型

控件名称

用途

显示信息

备注

01

RichTextBox

RxRichTextBox

显示接收

 

接收区

02

RichTextBox

TxRichTextBox

输入发送数据

1234567890

发送区

03

TextBox

RxTextBox

显示接收数量

 

计数器值

04

TextBox

TxTextBox

显示发送数量

 

计数器值

05

label

label1

指示接收计数区

R

计数器标识

06

label

Label2

指示发送计数区

T

计数器标识

07

Button

BtnClearCounter

清空计数器值

清零

 

08

Button

BtnComOpen

打开串口

打开

 

09

Button

BtnComClose

关闭串口

关闭

 

10

Button

BtnComTx

发送数据区的数据

发送

 

11

Button

BtnComRx

接收并显示数据

接收

 

12

comY

comY1

通信组件

 

通信服务

效果图如下


3.2、编写代码

双击界面中的五个按钮得到如下代码。

namespace TestComY

{

publicpartialclassForm1 :Form

    {

public Form1()

        {

            InitializeComponent();

        }

 

privatevoid BtnComTx_Click(object sender,EventArgs e)

        { }

privatevoid BtnComRx_Click(object sender,EventArgs e)

        { }

privatevoid BtnComOpen_Click(object sender,EventArgs e)

        { }

privatevoid BtnComClose_Click(object sender,EventArgs e)

        { }

privatevoid BtnClearCounter_Click(object sender,EventArgs e)

        { }

    }

}

 

3.3、打开串口

privatevoid BtnComOpen_Click(object sender, EventArgs e)

        {

            comY1.SetPortPara("COM1",115200);

            comY1.Open();

            BtnComOpen.Enabled = false;

            BtnComClose.Enabled = true;

        }

3.4、关闭串口

privatevoid BtnComClose_Click(object sender, EventArgs e)

        {

            comY1.Close();

            BtnComClose.Enabled = false;

            BtnComOpen.Enabled = true;

        }

3.5、发送数据及显示发送数据量

privatevoid BtnComTx_Click(object sender, EventArgs e)

        {

            comY1.Send(TxRichTextBox.Text);

            TxTextBox.Text = comY1.TxCounterVal.ToString();

        }

3.6、接收数据及显示接收数据量

privatevoid BtnComRx_Click(object sender, EventArgs e)

        {

if (comY1.IsGotNewData() == true)

                RxRichTextBox.Text += comY1.GetRxHexWithBlankString();

            RxTextBox.Text = comY1.RxCounterVal.ToString();

        }

 

3.7、清空计数器

privatevoid BtnClearCounter_Click(object sender, EventArgs e)

        {

            RxTextBox.Text = "";

            TxTextBox.Text = "";

            comY1.RxCounterVal = 0;

            comY1.TxCounterVal = 0;

        }

 

3.8、代码量

实现基本功能全部代码不到50行,如下图


3.8、运行效果图

3.8.1、打开串口


3.8.2、发送数据


3.8.3、接收数据


3.8.4、关闭串口点发送


3.9、发送接收中文及ASCII

3.9.1、打开串口修改如下

privatevoid BtnComOpen_Click(object sender,EventArgs e)

        {

            comY1.SetPortPara("COM1",115200);

comY1.IsHexMode = false;//添加代码

            comY1.Open();

            BtnComOpen.Enabled = false;

            BtnComClose.Enabled = true;

        }

3.9.2、接收代码修改如下

privatevoid BtnComRx_Click(object sender,EventArgs e)

        {

if (comY1.IsGotNewData() == true)

            {

if (comY1.IsHexMode==true)//添加代码

                    RxRichTextBox.Text += comY1.GetRxHexWithBlankString();

else

                    RxRichTextBox.Text += comY1.GetRxAsciiString();//添加代码

            }

            RxTextBox.Text = comY1.RxCounterVal.ToString();

        }

3.9.3、运行效果图如下


4、第2个例子(ComZ

4.1、新建窗体工程(testComZ)及添加控件如下表

序号

控件类型

控件名称

用途

显示信息

备注

01

RichTextBox

RxBox

显示接收

 

接收区

02

RichTextBox

TxBox

输入发送数据

12345678

发送区

03

TextBox

RxTextBox

显示接收数量

 

计数器值

04

TextBox

TxTextBox

显示发送数量

 

计数器值

05

label

Label2

指示接收计数区

发送

计数器标识

06

label

Label3

指示发送计数区

接收

计数器标识

07

Button

btnClean

清空计数器值

清零

 

08

Button

btnTx

发送数据区的数据

发送

 

09

Button

BtnRx

接收并显示数据

接收

 

10

comZ

comZ1

通信组件

 

通信服务

效果图如下


4.2、编写代码

双击界面上的按钮得到如下代码

namespace testComZ

{

publicpartialclassForm1 :Form

    {

public Form1()

        {

            InitializeComponent();

        }

privatevoid btnTx_Click(object sender,EventArgs e)

        { }

privatevoid BtnRx_Click(object sender,EventArgs e)

        { }

privatevoid btnClean_Click(object sender,EventArgs e)

        { }

    }

}

 

4.3、发送数据及显示发送数据量

privatevoid btnTx_Click(object sender,EventArgs e)

        {

UInt32 txcounter;

            comZ1.Send(TxBox.Text);

            txcounter=comZ1.TxCounterVal;

            TxTextBox.Text = txcounter.ToString();

        }

 

4.4、接收数据及显示接收数据量

privatevoid BtnRx_Click(object sender,EventArgs e)

        {

if (comZ1.IsGotNewData() == true)

            {

if (comZ1.IsHexMode == true)

                    RxBox.Text += comZ1.GetRxStringAndHexWithBlank();

else

                    RxBox.Text += comZ1.GetRxAsciiString();

                    RxTextBox.Text = comZ1.RxCounterVal.ToString();

            }

        }

4.5、清零计数器

privatevoid btnClean_Click(object sender,EventArgs e)

        {

            comZ1.TxCounterVal = 0;

            comZ1.RxCounterVal = 0;

            TxTextBox.Text = comZ1.TxCounterVal.ToString();

            RxTextBox.Text = comZ1.RxCounterVal.ToString();

        }

4.6、运行效果图

4.6.1、打开串口


4.6.2、发送数据


4.6.3、接收数据


4.6.4、发送中文及ASCII


4.7、代码量(全部仅仅35行)如下图


4.8、由代码量可见,整个基本功能的实现三分钟内即可完成。

 

5ComXYZ接口函数

5.1ComY

这是一个组件,基于SerialPort进行二次开发。

5.1.1、属性


 

序号

属性名称

含义

/类型

备注

1

Name

名称

字符串

自定义

2

IsOpen

串口打开

TRUE/FALSE

只读

3

IsHexMode

16进制模式

TRUE/FALSE

读写

4

RxCounterVal

接收计数器

32位变量

读写

5

TxCounterVal

发送计数器

32位变量

读写

 

5.1.2、方法

5.1.2.1、串口设置方法

publicstring[] GetComNameList()

publicvoid SetPortName(string Name)

publicvoid SetPortBaudRate(int BaudRate)

publicvoid SetPortDataBits(int Databits)

publicvoid SetPortParityBits(Parity Paritybits)

publicvoid SetPortStopBits(StopBits Stopbits)

publicvoid SetPortPara(string portName,int BaudRate)

publicvoid SetPortPara(int Databits,Parity Paritybits,StopBits Stopbits)

publicvoid SetPortPara(string portName,int BaudRate,int Databits,Parity Paritybits,StopBits Stopbits)

publicvoid SetPortPara(string portName,int BaudRate,int Databits,int Paritybits,int Stopbits)

 

5.1.2.2、串口打开与关闭

publicvoid Open()//打开失败弹窗提示

 publicvoid Close()

 

5.1.2.3、发送接收数据

publicbool Send(string SendText)

publicbool Send(bool HexMode,string SendText)

自动检测串口是否打开,两个函数均可发送16进制数与ASCII代码

5.1.2.4、接收数据

publicbool GetHexArrayFromRxBuff(byte[] buff,refint count)

提取16进制数据用于数据分析,无数据时返回false

publicstring GetRxString()

提取符串形式的数据,无数据时返回空。

publicstring GetRxStringAndHexWithBlank()

提取字符串形式的数据,16进制数据自动插入空格,无数据时返回空。

5.1.2.5、辅助方法

publicbool IsGotNewData()查询是否接收到新数据

publicvoid ForceClearHexBuffer()强制清空16进制数据缓存

 

5.2ComZ

这是一个复合组件,基于ComY进行再次开发,目的是简化ComY的使用,有一个可视的固定界面组合,如下图。


由图可见串口的基本配置已经实现。

5.2.1、属性

序号

属性名称

含义

/类型

备注

1

Name

名称

字符串

自定义

2

IsOpen

串口打开

TRUE/FALSE

只读

3

IsHexMode

16进制模式

TRUE/FALSE

读写

4

RxCounterVal

接收计数器

32位变量

读写

5

TxCounterVal

发送计数器

32位变量

读写

6

MaxComAmount

 

串口编号最大值

16位变量

读写默认50

 

5.2.2、开放方法

publicvoid Send(string SendText)

publicvoid Send(bool HexMode,string SendText)

publicbool IsGotNewData()

publicbool GetHexArrayFromRxBuff(byte[] buff,refint count)

publicstring GetRxAsciiString()

publicstring GetRxHexString()

publicstring GetRxStringAndHexWithBlank()

publicvoid ForceClearHexBuffer()