C# 从库中的串行端口返回值的最佳方法
我正在尝试通过串口发送和接收数据,我可以正常从DataReceived事件获取数据。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();
现在,我制作了一个库,它是通过串口发送和接收数据而开发的。我不知道如何通过两种不同的方法发送命令和检索值。
这让我很困惑,请帮帮我
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而崩溃。串行协议通常使用特定的字节值来指示响应的结束。这是什么设备?