C#界面程序设计——03串口com的界面实现及使用
本文介绍在界面设计中怎样达到使用下拉框选择串口、开关串口并在串口打开时如何进行数据交互。
一、建立串口并命名
在要设计的界面中首先拖入SerialPort,将其Name改为符合自身程序设计或串口功能的变量名。
本文中将SerialPort命名为RS232。
二、新建comboBox
三、将SerialPort、comboBox与界面Form关联起来
建立函数Form_load();
/*
* 函数:Form1_Load
* 功能:combox自动读取串口
* */
private void Form1_Load(object sender, EventArgs e)
{
string[] PortNames = SerialPort.GetPortNames();
if (PortNames.Length > 0)
{
comboBox1.Items.AddRange(PortNames);
}
}
然后回到界面,单击Form1,在属性框中找到事件中的Load,选中函数Form1_load(),将该函数绑定为界面Form1的触发事件,即在打开界面时就运行该函数。
再加入本系列第二章的按钮操作,即可打开或关闭该串口的连接。
效果为
该按钮操作的程序实现如下:
private void button2_Click(object sender, EventArgs e)//串口RS232的开关按钮
{
//打开与关闭串口的按钮
if (RS232.IsOpen)
{
RS232.Close();
comboBox1.Enabled = true;
button2.Text = "打 开";
}
else
{
RS232.PortName = comboBox1.SelectedItem.ToString();
RS232.Open();
comboBox1.Enabled = false;
button2.Text = "关 闭";
}
}
四、通过串口收发数据
通过串口发送数据比较简单
新建数组,然后为数组赋值(字符串数组也可,但一般使用byte型,便与解读、核对),再将数组名、起始位置、写入数据长度依次作为函数 串口名.Write的参数,即可写入。当然,前提是该串口已经通过上述界面操作而打开。
byte[] MingLing = new byte[11];
RS232.Write(MingLing, 0, MingLing.Length);//写入串口
重点来了!
对于串口的数据接收,基本实现方式为
byte[] Data = new byte[SPcom.BytesToRead];//接收数据,存入Data
RS232.Read(MingLing, 0, MingLing.Length);
但是该接收操作为瞬时发生,若该命令执行时,串口缓存区中没有数据(数据没能发过来),那么数据Data通过该条命令无法实现数据接收。
通过 循环+等待+接收判断 的方式来接收数据,理论上是可行的,但是对于界面操作者来说,如果在主线程中运行该操作,会导致界面卡顿直至接收到数据,单另线程跑该数据接收,在需要收到后回复操作、及时更新方面也有缺陷(包括定时器也有此缺陷)。
本文使用事件触发来实现数据接收。建立函数RS232_DataReceived,将该函数绑定为串口RS232的事件。
函数代码如下:
private void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] Data = new byte[SPcom.BytesToRead];//接收数据,存入Data
SPcom.Read(Data, 0, Data.Length);
}
该实例自测有效,运行结果由于较为复杂,在此不做展示。