C#界面程序设计——03串口com的界面实现及使用



本文介绍在界面设计中怎样达到使用下拉框选择串口、开关串口并在串口打开时如何进行数据交互。


一、建立串口并命名


在要设计的界面中首先拖入SerialPort,将其Name改为符合自身程序设计或串口功能的变量名。

swift 串口通信_数据


本文中将SerialPort命名为RS232。

swift 串口通信_swift 串口通信_02


二、新建comboBox

swift 串口通信_c#_03


三、将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的触发事件,即在打开界面时就运行该函数。

swift 串口通信_串口_04


swift 串口通信_数据_05


再加入本系列第二章的按钮操作,即可打开或关闭该串口的连接。

效果为

swift 串口通信_swift 串口通信_06


swift 串口通信_swift 串口通信_07


swift 串口通信_数据_08


该按钮操作的程序实现如下:

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的事件。

swift 串口通信_Data_09


swift 串口通信_数据_10


函数代码如下:

private void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e) 
        {
            byte[] Data = new byte[SPcom.BytesToRead];//接收数据,存入Data   
            SPcom.Read(Data, 0, Data.Length);
            }

该实例自测有效,运行结果由于较为复杂,在此不做展示。