C# Serial.DataRecieved 数据是分段的
C# Serial.DataRecieved data is in pieces
我正在制作一个程序,用于在所有可用的 COM 端口中搜索文本 "ConnectAlready." 感谢堆栈溢出方面的人员的帮助,我能够完成其中的大部分工作。我打印了在控制台上收到的数据,但我得到的不是一个字符串 "ConnectAlready",而是类似:
Conne
ct
alre
ady
每一个都是不同的字符串,因此我无法检查串行端口是否正在读取 "ConnectAlready."
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort serialPort1 = sender as SerialPort;
byte[] data = new byte[serialPort1.BytesToRead];
Stream portStream = serialPort1.BaseStream;
portStream.Read(data, 0, data.Length);
string dataString = Encoding.UTF8.GetString(data);
Console.WriteLine(dataString);
bool hasData = dataString.Contains("ConnectAlready");
if (hasData)
{
established = true;
estport = serialPort1.PortName;
MessageBox.Show(estport);
}
}
有什么建议吗?
感谢您的帮助!
好的,您的问题如下:如果您在端口上接收到数据,事件就会触发。然后你读取已经存在的字节。但是您的计算机比您的传输速度更快 --> 并非整个消息都已在您的缓冲区中。
这里有两种可能的解决方案:
1:如果您的消息末尾包含 Newline-Character,您可以像这样轻松完成:
//Add to your init:
YourSerialPort.Timeout = 100; //Maximum duration of your message in milliseconds
YourSerialPort.NewLine = "\r\n"; //You can also change the newline-character (you can also omit)
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string dataString = ((SerialPort)sender).ReadLine();
if (dataString.Contains("ConnectAlready"))
{
//Your code
}
}
如果您使用 Arduino Serial.println()-函数,这将是您的解决方案。
2:稍等片刻再阅读您的消息:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.sleep(50);
SerialPort serialPort1 = sender as SerialPort;
byte[] data = new byte[serialPort1.BytesToRead];
Stream portStream = serialPort1.BaseStream;
portStream.Read(data, 0, data.Length);
string dataString = Encoding.UTF8.GetString(data);
Console.WriteLine(dataString);
bool hasData = dataString.Contains("ConnectAlready");
if (hasData)
{
//Your code
}
}
祝你好运!
我正在制作一个程序,用于在所有可用的 COM 端口中搜索文本 "ConnectAlready." 感谢堆栈溢出方面的人员的帮助,我能够完成其中的大部分工作。我打印了在控制台上收到的数据,但我得到的不是一个字符串 "ConnectAlready",而是类似:
Conne
ct
alre
ady
每一个都是不同的字符串,因此我无法检查串行端口是否正在读取 "ConnectAlready."
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort serialPort1 = sender as SerialPort;
byte[] data = new byte[serialPort1.BytesToRead];
Stream portStream = serialPort1.BaseStream;
portStream.Read(data, 0, data.Length);
string dataString = Encoding.UTF8.GetString(data);
Console.WriteLine(dataString);
bool hasData = dataString.Contains("ConnectAlready");
if (hasData)
{
established = true;
estport = serialPort1.PortName;
MessageBox.Show(estport);
}
}
有什么建议吗? 感谢您的帮助!
好的,您的问题如下:如果您在端口上接收到数据,事件就会触发。然后你读取已经存在的字节。但是您的计算机比您的传输速度更快 --> 并非整个消息都已在您的缓冲区中。
这里有两种可能的解决方案:
1:如果您的消息末尾包含 Newline-Character,您可以像这样轻松完成:
//Add to your init:
YourSerialPort.Timeout = 100; //Maximum duration of your message in milliseconds
YourSerialPort.NewLine = "\r\n"; //You can also change the newline-character (you can also omit)
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string dataString = ((SerialPort)sender).ReadLine();
if (dataString.Contains("ConnectAlready"))
{
//Your code
}
}
如果您使用 Arduino Serial.println()-函数,这将是您的解决方案。
2:稍等片刻再阅读您的消息:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.sleep(50);
SerialPort serialPort1 = sender as SerialPort;
byte[] data = new byte[serialPort1.BytesToRead];
Stream portStream = serialPort1.BaseStream;
portStream.Read(data, 0, data.Length);
string dataString = Encoding.UTF8.GetString(data);
Console.WriteLine(dataString);
bool hasData = dataString.Contains("ConnectAlready");
if (hasData)
{
//Your code
}
}
祝你好运!