直接上代码:
需要注意的点:
1: 如果通过设备定义了握手协议,那么就要给SerialPort .Handshake设定握手协议
2:serialPort.RtsEnable = true; 具体情况设置(什么作用自行百度)
3:Post_DataReceived中,快速连续使用readLine()会抛异常,未能解决
using System;
using System.Diagnostics;
using System.IO.Ports;
using System.Text;
using System.Threading;
namespace TPCL.Port
{
class RS232
{
private SerialPort serialPort = null;
public delegate void ReceiveDataHandle(byte[] Data); //委托,接受数据处理
public event ReceiveDataHandle EventReceiveDataHandle;
private StringBuilder builder = new StringBuilder();
public bool Open(string portname, int baudRate, Parity parity, int dataBits, StopBits stopBit, Handshake handShake)
{
try
{
if (this.serialPort == null || this.serialPort.IsOpen == false)
{
serialPort = new SerialPort(portname, baudRate, parity, dataBits, stopBit);
serialPort.Handshake = handShake;
serialPort.WriteTimeout = 3000;
serialPort.ReadTimeout = 3000;
serialPort.ReceivedBytesThreshold = 1;
//serialPort.RtsEnable = true;
serialPort.Open();
serialPort.DataReceived += new SerialDataReceivedEventHandler(Post_DataReceived);//串口接收处理函数
return this.serialPort.IsOpen;
}
else
return this.serialPort.IsOpen;
}
catch (Exception)
{
this.Close();
return false;
}
}
public void Close()
{
if (this.serialPort != null)
this.serialPort.Close();
}
public int Send(string Data)
{
try
{
if (this.serialPort.IsOpen)
{
serialPort.DiscardInBuffer(); //清除接收缓冲区数据
serialPort.DiscardOutBuffer(); //清除传输缓冲区数据
byte[] data = Encoding.GetEncoding("GBK").GetBytes(Data.Trim() + "\r\n"); //打印机支持GBK中文
serialPort.Write(data, 0, data.Length);//写数据
return 0;
}
else
{
return 1;
}
}
catch (Exception)
{
return 2;
}
}
//接受自动触发,通过委托,传递给外部使用
private void Post_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
/*
Debug.WriteLine("-----------------read");
//字节读取,最好定义包头和包尾,避免读取数据只读了一部分
int DataLen = this.serialPort.BytesToRead;
byte[] ReDatas = new byte[DataLen];
serialPort.Read(ReDatas, 0, ReDatas.Length);
if (this.EventReceiveDataHandle != null)
this.EventReceiveDataHandle(ReDatas);
*/
//字符串读取
string Data = this.serialPort.ReadLine();
//string Data = this.serialPort.ReadExisting();
if (this.EventReceiveDataHandle != null)
this.EventReceiveDataHandle(System.Text.Encoding.ASCII.GetBytes(Data));
}
//手动获取数据
public byte[] Read()
{
try
{
Thread.Sleep(1000);
byte[] ReDatas = new byte[serialPort.BytesToRead];
serialPort.Read(ReDatas, 0, ReDatas.Length);
return ReDatas;
}
catch (Exception e)
{
return System.Text.Encoding.ASCII.GetBytes(e.Message);
}
}
public string ReadLine()
{
try
{
Thread.Sleep(1000);
return serialPort.ReadLine();
}
catch (Exception e)
{
return e.Message;
}
}
public bool IsOpen()
{
return this.serialPort.IsOpen;
}
}
}