C#串口通信—向串口發送數據,同步接收返回數據,
最近寫C#串口通信程序,系統是B/S架構。SerialPort類有一個DataReceived事件,用來接收串口返回的數據,但這種方式在C/S架構下很好用,但B/S就不好處理了。所以寫了一個同步模式接收返回數據的方法,不使用DataReceived事件。經過測試,可以正常使用(不支持多線程調用)。
一、Machine類
1、Machine類有一個靜態變量,定義如下:
private static SerialPort serialPort = null;
2、向串口發送數據,同步接收返回數據的方法:

![]()
/// <summary>
/// 向串口發送數據,讀取返回數據
/// </summary>
/// <param name="sendData">發送的數據</param>
/// <returns>返回的數據</returns>
private byte[] ReadPort(byte[] sendData)
{
if (serialPort == null)
{
serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.ReadBufferSize = 1024;
serialPort.WriteBufferSize = 1024;
}
if (!serialPort.IsOpen)
{
serialPort.Open();
}
//發送數據
serialPort.Write(sendData, 0, sendData.Length);
//讀取返回數據
while (serialPort.BytesToRead == 0)
{
Thread.Sleep(1);
}
Thread.Sleep(50); //50毫秒內數據接收完畢,可根據實際情況調整
byte[] recData = new byte[serialPort.BytesToRead];
serialPort.Read(recData, 0, recData.Length);
return recData;
}
View Code
3、發送聯機指令:

![]()
/// <summary>
/// 聯機
/// </summary>
/// <returns>聯機成功或失敗</returns>
public bool Connect(out string msg)
{
byte[] sendData = new byte[] { 0x01, 0x01, 0x00, 0x00 };
CommonUtil.CalCheckCode(sendData);
byte[] recData = ReadPort(sendData);
if (recData.Length >= 4
&& recData[0] == 0x01
&& recData[1] == 0x02
&& recData[2] == 0x00
&& CommonUtil.ValidCheckCode(recData))
{
switch (recData[3])
{
case 0x00:
msg = "控制主板正在重啟";
return false;
case 0x01:
msg = "聯機成功";
return true;
case 0x02:
msg = "控制主板正在維護";
return false;
case 0x03:
msg = "控制主板收到的數據格式不正確";
return false;
default:
msg = "未知狀態";
return false;
}
}
else
{
msg = "貨機返回的數據格式不正確";
return false;
}
}
View Code
二、如何使用,這裡是在C/S程序中測試,在B/S程序中也可以正常使用,下面是窗體Form1類中的代碼:
1、定義對象及初始化

![]()
private Machine machine = null;
public Form1()
{
InitializeComponent();
machine = new Machine();
}
View Code
2、聯機事件

![]()
//聯機
private void btnConnect_Click(object sender, EventArgs e)
{
string msg = null;
if (machine.Connect(out msg))
{
MessageBox.Show("成功:" + msg);
}
else
{
MessageBox.Show("失敗:" + msg);
}
}
View Code