C# 为什么SerialDataReceiveDeventarg接收不完整的数据?

C# 为什么SerialDataReceiveDeventarg接收不完整的数据?,c#,serial-port,C#,Serial Port,我目前在IO板上工作。串行对象已初始化并侦听传入数据。我正在使用SerialPort1.ReadExisting()读取传入数据作为传入字符串,预期在每次读取中以{X000000}5E+\r\n的形式到达 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { TextBox2.Invoke(new Eve

我目前在IO板上工作。串行对象已初始化并侦听传入数据。我正在使用
SerialPort1.ReadExisting()读取传入数据
作为传入字符串,预期在每次读取中以{X000000}5E+
\r\n
的形式到达

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    try
    {
        TextBox2.Invoke(new EventHandler(delegate
        {
            TextBox2.AppendText(SerialPort1.ReadExisting());
        }));
    }
    catch
    {
        MessageBox.Show("Couldn't open Port", "Error");
    }
}

当像那样使用ReadExisting()时,我得到了我想要的结果,并且我将得到介于“{X”和“}”之间的值,但是当我执行拆分字符时,我总是得到关于索引越界的错误。我通过在读取时添加
Environment.NewLine
来改变读取方式,以获取数据是否完整接收。结果将如下图所示

根据SO答案,我也会尝试下面的方法,但传入的字符串数据将与上面的图像相同:-

var end = '\r';
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);

string RxString = System.Text.Encoding.ASCII.GetString(data);
LogEvents($"Serial port data: {RxString}");
这就好像全套{x0000005e在拆分为
SerialDataReceivedEventArgs
时出现了1-3次


我读错了吗?我还将波特率从9600提高到19200,但传入的数据仍然与提供的图像相同。这与IO板程序有关吗?我对此不太确定。

正如@jdweng指出的,串行端口
DataReceived
事件有点随机触发。它可以触发中间字符串,而您只能接收一半的消息。您必须构建自己的字符串。大多数串行到串行通信使用回车符(
\r
)或换行符(
\n
)来确定消息已完成。根据你告诉我们的,看起来你在最后加了一个
,所以我们可以查找LF,知道我们得到了整个字符串

char LF = (char)10;
StringBuilder sb = new StringBuilder();
string currentLine = string.Empty;

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string Data = serialPort1.ReadExisting();

    foreach (char c in Data)
    {
        if (c == LF)
        {
            sb.Append(c);

            CurrentLine = sb.ToString();
            sb.Clear();

            //parse CurrentLine here or print it to textbox
        }
        else
        {
            sb.Append(c);
        }
    }
}

所以在上面的例子中,我在寻找一个换行符来知道我得到了整个消息。(LF或
\n
)。

“但是当我进行拆分字符时,我总是会得到关于索引越界的错误”。。。在文章的代码示例中没有类似的内容。。。请查看关于发布代码的指导。@AlexeiLevenkov,声明是因为我在IO板上安装了6套按钮。每个按钮代表000000的索引。如果按下按钮#2,结果将为{X010000}5E。我必须对数据进行子串,并将记录从索引2(长度为6)放入
tocharray()
,然后找到索引
inti=Array.IndexOf(charData,'1')当我读取当前代码和子字符串时,如果传入数据不完整{X########}5E,则将出现错误。串行端口不保证在一个块中接收所有发送数据。Windows使用定时器在应用程序和硬件接口之间转发串行端口数据。波特率只是传输速率,而不是实际发送速率。如果设备每秒仅发送1个字符,则传输速率仍可达到9600。例如,假设一个应用程序每分钟发送一次时间,时间消息包含10个字符。在9600的传输速率下,您每分钟可以得到10个字符。@jdweng,所以这取决于设备?因为io板的编程器将在2-3天内在我的位置上可用。根据您的详细信息,我只知道接收到的数据取决于设备容量。您可能正在传输以回车符终止的ASCII数据。多年来,我们开发了一系列与程序员交互的软件。