我需要处理通过串行端口发送的数据的直接响应并显示结果。我使用SerialPort的DataReceived事件接收不太方便。因为我需要在主窗体内的窗体中处理传入消息,而不是在主窗体上。这就是为什么我必须写作和阅读。但是,写入我使用的代码后,BytesToRead 在 while(serialPort.BytesToRead > 0) 这一步始终返回 0,并且不进入这一步。如果我在开头添加 while(true) ,它会等到超时,有时会读取,但数据会丢失。简单地执行 Serial.write(data,0,data.count) 后如何获得响应?
newBytetoString = new List<byte>();
var dataString = "#45M*";
var data = Encoding.ASCII.GetBytes(dataString);
try
{
_serialPort.Write(data.ToArray(), 0, data.ToArray().Count());
Thread.Sleep(100);
}
catch (Exception ex)
{
return null;
}
try
{
byte[] inbuffer = new byte[1];
List<byte> bytesReceived = new List<byte>();
List<byte> responseReceived = new List<byte>();
System.Timers.Timer _responseTimer = new System.Timers.Timer();
_responseTimer.Interval = 5000;
_responseTimer.Elapsed += ResponseTimer_Elapsed;
_responseTimer.AutoReset = false;
_responseTimer.Start();
while (!_responseTimedOut)
{
while (_serialPort.BytesToRead > 0)
{
var byteRead = _serialPort.Read(inbuffer, 0, inbuffer.Length);
bytesReceived.Add(inbuffer[0]);
responseReceived.Add(inbuffer[0]);
Thread.Sleep(5);
}
else _responseTimedOut = true;
}
_responseTimer.Stop();
_responseTimedOut = false;
//_serialPort.Close();
//_serialPort.Dispose();
return bytesReceived.ToArray();
}
catch (Exception ex)
{
return null;
}
如果您不想使用 DataReceived 事件,而只想简单地写入一条消息然后读取,则可以使用类似于以下的代码:
var serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.Open();
// Write data to the serial port
string data = "Hello, World!";
serialPort.Write(data);
// Read data from the serial port
string receivedData = serialPort.ReadExisting();
Console.WriteLine($"Received data: {receivedData}");
serialPort.Close();
ReadExisting函数将读取串口输入缓冲区中当前可用的所有数据,并将其作为字符串返回。
如果您在看到数据返回时仍然遇到问题,我会参考您设备上的文档,并确保您已设置正确的 com 端口设置(波特率等)。希望这有帮助。