由于工作需要,第一次接触串口编程.所以不得不在网上查阅各种编程实例.最后结合自己的理解与实践,最终有了如下代码.
本代码只经过了简单的软件测试,与简单的硬件测试.
本人从事编程不足一年,望各位前辈以及同行指点,在此谢谢.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Threading;
- using System.IO.Ports;
- namespace PacketsTest
- {
- class ComSR
- {
- private SerialPort serialPort;
- private bool status = false;//接受结束状态,true为成功接收到数据.
- private byte[] reciveData = null;//接受到的数据存储到这里.
- public bool Status
- {
- set { status = value; }
- get { return status; }
- }
- public byte[] RecivedData
- {
- get { return reciveData; }
- }
- public SerialPort _SerialPort
- {
- get { return serialPort; }
- }
- public ComSR(string portName,int baudRate,int dataBits,Parity parity,StopBits stopbits)
- {
- serialPort = new SerialPort();
- serialPort.PortName = portName;//设置端口
- serialPort.BaudRate = baudRate;//设置波特率
- serialPort.DataBits = dataBits;//设置数据长度
- serialPort.Parity = parity;//设置奇偶校验协议
- serialPort.StopBits = stopbits;//停止位
- serialPort.ReceivedBytesThreshold = 1;//这里是读事件触发条件,1代表一个字节
- serialPort.DtrEnable = true;//启用数据终端就绪信号
- serialPort.RtsEnable = true;//请求发送就绪信号
- serialPort.DataReceived += new SerialDataReceivedEventHandler(Data_Recive);//绑定处理读事件的函数.
- }
- public void SendBuff(byte[] data)
- {
- try
- {
- serialPort.Write(data, 0, data.Length);//这里是写
- }
- catch (Exception e)
- {
- if (serialPort != null && serialPort.IsOpen)
- {
- status = false; //这个status是我在上层类中判断端口读写状态的属性,可以去掉
- serialPort.Close();
- }
- }
- }
- void Data_Recive(object o, EventArgs e)//这个是读端口,事件处理函数
- {
- try
- {
- Thread.Sleep(3);
- int length = serialPort.BytesToRead;
- reciveData = new byte[length];
- serialPort.Read(reciveData, 0, length);
- while (serialPort.BytesToRead != 0)//由于数据长度读写不一,而且时间很难确定,所以在这里做了这样的处理
- {
- Thread.Sleep(1);
- }
- if (serialPort.IsOpen)
- {
- status = true;
- //serialPort.Close();//这里不应该关闭,应当在更高层次的程序上关闭端口.
- }
- }
- catch (Exception ex)
- {
- if (serialPort != null &&serialPort.IsOpen)
- {
- status = false;
- serialPort.Close();
- }
- }
- }
- public void PortOpen()
- {
- if (!serialPort.IsOpen)
- {
- serialPort.Open();
- }
- else
- {
- serialPort.Close();
- serialPort.Open();
- }
- }
- /// <summary>
- /// 关闭端口
- /// </summary>
- public void PortClose()
- {
- if (serialPort != null && serialPort.IsOpen)
- {
- serialPort.Close();
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Threading;
- using System.IO.Ports;
- namespace PacketsTest
- {
- class ComSR
- {
- private SerialPort serialPort;
- private byte[] reciveData = null;//接受到的数据存储到这里.
- public byte[] RecivedData
- {
- get { return reciveData; }
- }
- public SerialPort _SerialPort
- {
- get { return serialPort; }
- }
- public ComSR(string portName,int baudRate,int dataBits,Parity parity,StopBits stopbits)
- {
- serialPort = new SerialPort();
- serialPort.PortName = portName;//设置端口
- serialPort.BaudRate = baudRate;//设置波特率
- serialPort.DataBits = dataBits;//设置数据长度
- serialPort.Parity = parity;//设置奇偶校验协议
- serialPort.StopBits = stopbits;
- serialPort.ReceivedBytesThreshold = 1;
- serialPort.DtrEnable = true;
- serialPort.RtsEnable = true;
- serialPort.DataReceived += new SerialDataReceivedEventHandler(Data_Recive);
- }
- public void SendBuff(byte[] data)
- {
- try
- {
- serialPort.Write(data, 0, data.Length);
- }
- catch (Exception e)
- {
- if (serialPort != null && serialPort.IsOpen)
- {
- serialPort.Close();
- }
- }
- }
- void Data_Recive(object o, EventArgs e)
- {
- try
- {
- Thread.Sleep(5);
- int length = serialPort.BytesToRead;
- Thread.Sleep(2);
- while (serialPort.BytesToRead > length)
- {
- length = serialPort.BytesToRead;
- Thread.Sleep(2);
- Console.WriteLine(length + "," + serialPort.BytesToRead);
- }
- reciveData = new byte[length];
- serialPort.Read(reciveData, 0, length);
- }
- catch (Exception ex)
- {
- if (serialPort != null &&serialPort.IsOpen)
- {
- serialPort.Close();
- }
- }
- }
- public void PortOpen()
- {
- if (!serialPort.IsOpen)
- {
- serialPort.Open();
- }
- else
- {
- serialPort.Close();
- serialPort.Open();
- }
- }
- /// <summary>
- /// 关闭端口
- /// </summary>
- public void PortClose()
- {
- if (serialPort != null && serialPort.IsOpen)
- {
- serialPort.Close();
- }
- }
- }
- }
来源: https://www.oschina.net/code/snippet_2551141_58718