C# 从库中的串行端口返回值的最佳方法

C# 从库中的串行端口返回值的最佳方法,c#,.net,dll,serial-port,C#,.net,Dll,Serial Port,我正在尝试通过串口发送和接收数据,我可以正常从DataReceived事件获取数据。 现在,我制作了一个库,它是通过串口发送和接收数据而开发的。我不知道如何通过两种不同的方法发送命令和检索值。 这让我很困惑,请帮帮我 static void Main(string[] args) { FXReader reader = new FXReader(); reader.ComPort = port; reader.Connect();

我正在尝试通过串口发送和接收数据,我可以正常从DataReceived事件获取数据。
现在,我制作了一个库,它是通过串口发送和接收数据而开发的。我不知道如何通过两种不同的方法发送命令和检索值。
这让我很困惑,请帮帮我

    static void Main(string[] args)
    {
        FXReader reader = new FXReader();
        reader.ComPort = port;
        reader.Connect();

        Console.WriteLine(reader.SetPortPower(1));
        Console.ReadLine();
        Console.WriteLine(reader.GetPortStatus(1));
        Console.ReadLine();
    }

public class FXReader : IDisposable
{
    private SerialPort rs232 = null;

    public string ComPort
    {
        get { return rs232.PortName; }
        set { rs232.PortName = value; }
    }

    public bool IsConnected
    {
        get { return rs232.IsOpen; }
    }

    public F520Reader()
    {
        rs232 = new SerialPort();
        rs232.BaudRate = 115200;            
        rs232.Parity = Parity.None;
        rs232.DataBits = 8;
        rs232.StopBits = StopBits.One;
        rs232.DataReceived += new SerialDataReceivedEventHandler(rs232_DataReceived);
    }

    public void Connect()
    {
        rs232.Open();
    }

    public void Disconnect()
    {
        rs232.Close();
    }

    public int GetPortPower(int port)
    {
        if (rs232.IsOpen)
        {
            byte[] command = { 0x5A, 0x00, 0x19, 0x00, 0x01, 0xFF, 0xFF, 0x7E };
            rs232.Write(command, 0, command.Length);

            //How can i get value from the event of "rs232_DataReceived"
            return powervalue;
        }
    }

    public int GetPortStatus(int port)
    {
        if (rs232.IsOpen)
        {
            byte[] command = { 0x5A, 0x00, 0x19, 0x00, 0x01, 0xFF, 0xFF, 0x7E };
            rs232.Write(command, 0, command.Length);

            //How can i get value from the event of "rs232_DataReceived"
            return statusvalue;
        }
    }

    void rs232_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        System.Threading.Thread.Sleep(50);
        if (rs232.BytesToRead > 0)
        {
            byte[] recvBuffer = new byte[1024];
            int recvLength = rs232.Read(recvBuffer, 0, recvBuffer.Length);
            Array.Resize(ref recvBuffer, recvLength);

            PharseResponse(recvBuffer);
        }
    }

    private void PharseResponse(byte[] buffer)
    {
        if (buffer[0] == 0x5A && buffer[buffer.Length - 1] == 0x7E)
        {
            #region Response for Get Port Power
            if (buffer[1] == 0x01 && buffer[2] == 0x13)
            {
                //How can I return value by the method of "GetPortPower"
                return buffer[7];
            }
            #endregion

            #region Response for Get Port Status
            if (buffer[1] == 0x01 && buffer[2] == 0x14)
            {
                //How can I return value by the method of "GetPortStatus"
                return buffer[7];
            }
            #endregion
        }
    }       

    #region IDisposable Members

    public void Dispose()
    {
        if (rs232.IsOpen)
            rs232.Close();

        rs232.Dispose();
    }

    #endregion
}
这当然不是“最好的办法”。使用DataReceived事件不会给您带来任何好处。它在事件驱动的应用程序中非常有用,例如GUI应用程序。但不是像这样的应用程序,在你们继续你们的程序之前,你们必须得到一个响应

所以不要使用它,而是直接调用Read()方法。您的程序将被阻止,直到设备发回某些信息


这也将帮助您编写正确的代码,但它现在并不正确。从串行端口读取通常只产生一个或两个字节。Read()的返回值告诉您得到了多少。在获得完整的响应之前,无法解析响应。从您当前的代码来看,“complete”看起来不是很明显,但您需要至少收到8个字节,PharSerResponse()方法才能停止因IndexOutOfRangeException而崩溃。串行协议通常使用特定的字节值来指示响应的结束。

这是什么设备?