C#实现串口通讯

C# 串口通信

  • 触发串口

触发串口

工作需要开发一个串口通讯的软件,我选择了C#语言,这里记录一下开发过程。

首先要申明一个串口:

using System.IO.Ports;  //引入包

public SerialPort serialPort = new SerialPort();

然后要打开一个串口,打开串口很简单,open就好了,但是要打开哪个串口呢,这个时候就需要先获取计算机拥有的串口:

string[] SpNum = SerialPort.GetPortNames();

我写的是winform程序,在界面上是用ComboBox来显示本机串口的,所以要把获得的串口名添加进ComboBox下拉列表中:

            if (SpNum.Length != 0)   //判断所获得的串口数不为0
            {
                for (int i = 0; i < SpNum.Length; i++)
                {
                    cbSelectCom00.Items.Add(SpNum[i]);
                    cbSelectCom01.Items.Add(SpNum[i]);
                }
            }

在打开串口前,需要设置串口的属性,也就是波特率、数据位、校验位、停止位:

            serialPort.DataBits = 8;
            serialPort.BaudRate = 9600;
            serialPort.Parity = Parity.None;
            serialPort.StopBits = StopBits.One;

选择一个要打开的串口,将它打开:

            if (cbSelectCom00.SelectedItem == null)  //判断是否选择了串口,如果没有选择
            {
                MessageBox.Show("请先选择物理端口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.cbSelectCom00.Focus();    //将鼠标聚焦在当前控件上
            }
            else   //如果选择了
            {
                try
                {
                    if (cbSelectCom00.Enabled == true)
                    {
                        pc0.serialPort.PortName = cbSelectCom00.SelectedItem.ToString();
                        pc0.serialPort.Open();     //打开串口
                        OpenCom00.Text = "已打开";
                        cbSelectCom00.Enabled = false;
                        OpenCom00.BackColor = System.Drawing.Color.Cyan;
                        pc0.serialPort.ReceivedBytesThreshold = 1;      //多少个字节触发DataReceived事件
                        pc0.comtag = 0;
                        pc0.serialPort.DataReceived += new SerialDataReceivedEventHandler(pc0.serialPort_DataReceived);   //触发事件
                    }
                    else
                    {
                        pc0.serialPort.Close();
                        OpenCom00.Text = "打开";
                        OpenCom00.BackColor = Color.White;
                        cbSelectCom00.Text = "";
                        cbSelectCom00.Enabled = true;
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

serialPort.ReceivedBytesThreshold 是指接收到多少个字节后触发DataReceived事件;

public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//读取缓存区数据
//将数据写入串口
}

读取缓存区的数据:

                Thread.Sleep(80);       
                int n = serialPort.BytesToRead;
                byte[] buff = new byte[n];
                serialPort.Read(buff, 0, n);

将数据写入串口:

byte[] Rx = new byte[70];
serialPort.Write(Rx, 0, Rx.Length);

注意:我们都希望理想的状态是串口有规律的收发字节,不要丢包,我尝试了之后,用的比较笨的方法,就是Thread.Sleep()让线程等一下,避免接收的数据被新接收的数据覆盖,避免当前的数据包还没发完又写入新的数据包,这个要通过自己不断的测试找到那个合适的等待的时间。

你可能感兴趣的:(c#)