C#串口通信-向串口发送数据,同步接收返回数据

来源:互联网 发布:linux jmx监控tomcat 编辑:程序博客网 时间:2024/05/22 02:01
最近写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        && 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);    }}
0 0
原创粉丝点击