第一种,绑定串口的接收事件
using System.IO.Ports;
//声明串口
SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
//绑定串口接收事件
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceive_Method);
//打开串口
mySerialPort.Open();
//定义事件
private void DataReceive_Method(object sender, SerialDataReceivedEventArgs e)
{
MessageBox.Show(mySerialPort.ReadExisting());
}
第二种,发送后循环判断接收缓存区的字节数
//获取接收缓冲区中数据的字节数
if (mySerialPort.BytesToRead > 0)
private bool SendAndReceive(byte[] send, ref byte[] response)
{
try
{
MyCom.Write(send, 0, send.Length);
byte[] buffer = new byte[1024];
MemoryStream ms = new MemoryStream();
DateTime start = DateTime.Now;
//串口的接收事件:
while (true)
{
if (MyCom.BytesToRead > 0)
{
int count = MyCom.Read(buffer, 0, buffer.Length);
ms.Write(buffer, 0, count);
}
else
{
if ((DateTime.Now - start).TotalMilliseconds > this.RcvTimeOut)
{
ms.Dispose();
return false;
}
else if (ms.Length > 0)
{
break;
}
}
}
response = ms.ToArray();
return true;
}
catch
{
return false;
}
}
byte[] response = null;
int byteLength = iLength * 2;
if (SendAndReceive(sendCommand.ToArray(), ref response))
{
//验证报文
if (response.Length == 5 + byteLength)
{
if (response[0] == iDevAddr && response[1] == 0x04 && response[2] == byteLength && CheckCRC(response))
{
return GetByteArray(response, 3, response.Length - 5);
}
}
}
else
{
return null;
}