串口数据即将重复或重新发送(某些字符)

时间:2013-02-05 12:51:44

标签: c# .net serial-port

让我解释一下这个场景:带有数据的串口(字符串)如下例所示:

02051014 0009 M 0 741 30041105 2632 0 30041105

我尝试了各种读取(读取,读取字节,读取字符,读取行,读取存在)。我尝试更改new line,但数据保持重复。请看上面的示例,现在看看数据的来源:

0220510114 00009 M 0 741 300441105 2632 0 300411055

任何人都知道如何解决这个问题?

代码:

[...]
try
{
    this.serialPort = new SerialPort("COM1", 2400, Parity.None, 7, StopBits.One);
    this.serialPort.DataReceived += new SerialDataReceivedEventHandler(portaSerial_DataReceived);
    this.serialPort.Handshake = Handshake.XOnXOff;
    this.serialPort.Encoding = Encoding.ASCII;
    this.serialPort.Open();
}
[...]
private void portaSerial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    try
    {
        var invalidValuesToBreakLine = new int[] { 13, 10, 0 };
        int data;

        while (this.serialPort.BytesToRead > 0)
        {
            data = this.serialPort.ReadChar();

            if (invalidValuesToBreakLine.Contains(data))
            {
                if (!this.breakLineWasPerformed)
                {
                    this.breakLineWasPerformed = true;

                    this.dataList.Add(this.temporaryString);

                    this.temporaryString = string.Empty;
                }
            }
            else
            {
                if (this.breakLineWasPerformed)
                {
                    this.breakLineWasPerformed = false;
                }

                this.temporaryString += (char)data;
            }
        }
[...]

2 个答案:

答案 0 :(得分:0)

挖了我发现这个StackOverflow question / answer表明DataReceived事件可能会在意外时间触发。所以,如果可能的话,你应该设置一个NewLine并触发它。

作为对此想法的测试,您可以尝试添加按钮并等到知道您有一些数据,然后单击它以显示流。如果没有重复,则指向DataReceived事件过度急切并且未正确触发。然后,您可以查看NewLineDtrEnableDsrHolding等。

private void TestButton_Click(object sender, EventArgs e)
{
    string indata = this.serialPort.ReadExisting();
    MessageBox.Show(indata);
}

答案 1 :(得分:0)

我要尝试的第一件事是在每次调用data方法后将ReadChar()重置为空字符串,或者刷新输入缓冲区。

我怀疑对BytesToRead()的调用返回大于零,但ReadChar()调用返回串口缓冲区上的原始字符。这是由于串行端口的内部时序,以及您的代码可能为硬件设备“运行得太快”这一事实。

我可能会重新考虑方法中的整个while循环。您可以简化这一过程,并尝试以下(使用您的自定义代码)

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
}

要更改换行符,只需检查indata字符串并打破字符,将结果存储在全局变量中,然后重复使用左侧数据。