c# - 串行端口数据重复或重新发送(一些字符)

标签 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;
            }
        }
[...]

最佳答案

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

我怀疑对 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 字符串并中断字符,将结果存储在全局变量中,然后重用剩余的数据。

关于c# - 串行端口数据重复或重新发送(一些字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708011/

相关文章:

c# - 使用 C# 中的 Invoke-SqlCmd cmdlet 执行 PowerShell 脚本

c# - Windows/amd64 Server 2016没有匹配的 list

c - C 程序中标准输入和标准输出的重定向

C#:将文本文件内容与字符串变量进行比较

c# - 我如何隐式地将我的类转换为另一种类型?

.net - SQLite 数据库允许的最大大小是多少,我可以使用 PetaPoco 作为 ORM 吗?

c# - ASP.Net Mvc : Cannot access my models namespace from my view

serial-port - QEMU 不会创建第二个串行端口(Ubuntu x86-64 guest 和主机)

java - 如何从 Arduino 接收数据?

C# MVVM 如何将命令添加到 TextBlock