首先:作为C#新人,在练习SerialPort串口通信时,这里采用“自发自收”(由于没有现成的单片机)。
发现了一个问题,就是传输速度太慢,大概速度:1字节/4毫秒,但实际要求要达到:1字节/1毫秒。
所以自己参照技术主管的封装类自己写了一个,旨在提高串口传输数据速度同时提高自己的编程能力。
下面为该类的代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
class SerialPortHelper//当前类为串口的封装类
{
public SerialPort serialport = null;
public bool isOpen = false;
public delegate bool SerialPortDataReceived(byte[] zj);
public event SerialPortDataReceived serialPortDataReceived = null;
int maxinterval = 0;//定义一个接受字节的最大时间间隔
public SerialPortHelper()
{
serialport = new SerialPort();//实例化串口对象
}
public SerialPortHelper(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits)
{
serialport = new SerialPort();//实例化并初始化串口对象
serialport.PortName = portName;
serialport.BaudRate = baudRate;
serialport.DataBits = dataBits;
serialport.Parity = parity;
serialport.StopBits = stopBits;
//创建委托 “SerialDataReceivedEventHandler”类型的对象,用该对象来持有符合其方法定义标准的指定方法
//SerialDataReceivedEventHandler seriDataReceEvenHandler =AcceptData;
//这里特别注意的是不能使用同一个委托对象,因为这样他会把当前接受到的数据和上次接受到的数据放到一块给我们一 //块返回并显示出来。
//串口对象的数据接受事件属性为 “SerialDataReceivedEventHandler”类型,所以把持有数据接受方法的委托对象赋值给他。
serialport.DataReceived +=new SerialDataReceivedEventHandler(AcceptData);
//在打开串口前设置串口的常用参数
serialport.ReceivedBytesThreshold = 1;
serialport.ReadBufferSize = 526;
serialport.WriteBufferSize = 526;
serialport.WriteTimeout = 1000;
serialport.ReadTimeout = 1000;
if (baudRate<=19200)
{
maxinterval = 25;
}
else
{
maxinterval = 15;
}
}
public bool openPort()
{
try
{
if (serialport.IsOpen == false)
{
serialport.Open();
isOpen = true;
return isOpen;
}
isOpen = false;
return isOpen;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
isOpen = true;
return isOpen;
}
}
public bool closePort()
{
serialport.Close();
isOpen = false;
return isOpen;
}
public void SendData(byte[] zj)
{
serialport.Write(zj,0,zj.Length);
}
public void AcceptData(object sender,SerialDataReceivedEventArgs e)
{
try
{
int count = 0;
maxinterval = 15;
System.Threading.Thread.Sleep(maxinterval);
for (int t = 0; t < 20; t++)
{
if (serialport.BytesToRead == count)
{
break;
}
else
{
count = serialport.BytesToRead;
System.Threading.Thread.Sleep(maxinterval);
}
}
count = serialport.BytesToRead;
byte[] accepData = new byte[count];
serialport.Read(accepData, 0, count);
if (serialPortDataReceived != null && accepData.Length > 0)
{
serialPortDataReceived(accepData);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
}
}