.NET 串行端口 - 接收丢失的数据
.NET serial-ports - receiving missing data
我正在开发一个串口应用程序。而且我无法正确接收数据。我正在使用 ReadExisting() 来读取即将到来的数据。
这是我的代码。请指教,接收数据的正确方法是什么,如果我想检查每条消息的长度和格式的有效性怎么办。
public void serialport_connect(String port, int baudrate, Parity parity, int databits, StopBits stopbits)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
sport = new System.IO.Ports.SerialPort(port, baudrate, parity, databits, stopbits);
try
{
sport.Open();
status.AppendText("[" + dtn + "] " + "Connected\n");
sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
}
catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); }
}
private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
String comingData = sport.ReadExisting();
if (comingData != String.Empty)
{
Dispatcher.Invoke(new Action(() =>
{
current.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n");
}));
}
}
谢谢。
您的事件循环比以 9600 波特率发送单个字符所需的时间快得多。我建议将接收到的字符附加到字符串中,直到您收到像“\n”这样的终止字符或收到您期望的字符数。
这是一个项目的示例,我在其中等待直到收到 10 个字符:
int datalen = serialPort1.BytesToRead;
label1.Text="Readexisting";
if (datalen >=10)
{
string data = serialPort1.ReadExisting();
label1.Text=data;
}
我正在开发一个串口应用程序。而且我无法正确接收数据。我正在使用 ReadExisting() 来读取即将到来的数据。
这是我的代码。请指教,接收数据的正确方法是什么,如果我想检查每条消息的长度和格式的有效性怎么办。
public void serialport_connect(String port, int baudrate, Parity parity, int databits, StopBits stopbits)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
sport = new System.IO.Ports.SerialPort(port, baudrate, parity, databits, stopbits);
try
{
sport.Open();
status.AppendText("[" + dtn + "] " + "Connected\n");
sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
}
catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); }
}
private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
String comingData = sport.ReadExisting();
if (comingData != String.Empty)
{
Dispatcher.Invoke(new Action(() =>
{
current.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n");
}));
}
}
谢谢。
您的事件循环比以 9600 波特率发送单个字符所需的时间快得多。我建议将接收到的字符附加到字符串中,直到您收到像“\n”这样的终止字符或收到您期望的字符数。
这是一个项目的示例,我在其中等待直到收到 10 个字符:
int datalen = serialPort1.BytesToRead;
label1.Text="Readexisting";
if (datalen >=10)
{
string data = serialPort1.ReadExisting();
label1.Text=data;
}