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;
}
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
write的返回值
&& 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;
}
}
⼆、如何使⽤,这⾥是在C/S程序中测试,在B/S程序中也可以正常使⽤,下⾯是窗体Form1类中的代码:    1、定义对象及初始化
private Machine machine = null;
public Form1()
{
InitializeComponent();
machine = new Machine();
}
2、联机事件
//联机
private void btnConnect_Click(object sender, EventArgs e) {
string msg = null;
if (machine.Connect(out msg))
{
MessageBox.Show("成功:" + msg);
}
else
{
MessageBox.Show("失败:" + msg);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。