串行端口上收到的重复数据

时间:2011-12-21 02:25:33

标签: c#

我正在使用C#和串口(USB转串口)从警察扫描仪读取数据。当我在不同的程序中查看数据时,没有问题。当我使用下面的代码时,我会得到重复(重复)的所有行。我做错了什么?

SerialPort _sp = new SerialPort();
_sp.BaudRate = 115000;
_sp.DataBits = 8;
_sp.Parity = Parity.None;
_sp.StopBits = StopBits.One;

以及启动串口读取的功能......

public void StartSerial()
{
    _sp.PortName = comboPorts.SelectedItem.ToString();
    _sp.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
    _sp.Open();
}

和读取功能......

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    try
    {
        String strLine = _sp.ReadLine();
        // Handle Data
    }
    catch { }
}

手册说明需要以下内容:

  

要查看CCDump数据,请使用USB PC / IF电缆将收音机连接到个人计算机。启动终端程序或第三方应用程序软件。配置“115200,N,8,1”的通信参数如下:

     

COM端口:计算机分配给USB电缆的COM端口号。如果您运行的是Windows操作系统,则可以在“设备管理器”中的“端口”下找到此信息。

     

奇偶校验:无

     

波特率:每秒115,000位

     

字:8位

     

停止比特:1

4 个答案:

答案 0 :(得分:1)

在我看来,即使只有一行数据,serialPort_DataReceived事件已被多次触发,

检查设置,应该有一个阈值,这意味着如果数据长度小于阈值,那么事件将不会被触发。

同时,请确保您只注册一次事件......

答案 1 :(得分:1)

您必须一次读取可用的任何数据。不要使用ReadLine,因为它不清楚设备使用哪个字符发送LF或CR,或者甚至将它们发送给您。而是使用它:

            int totalBytes = _sp.BytesToRead;
            byte[] buffer = new byte[totalBytes];
            _sp.Read(buffer, 0, totalBytes);

  string line = _sp.ReadExisting();

答案 2 :(得分:1)

我正在编写一个应用程序,它通过USB记录串行数据并遇到类似的问题,其中我得到了不完整(部分)数据,重复数据和最差,两者的组合。问题是后者解决了。

原因是DataReceive不会一致地触发,并且如果没有配置限制,它可能会触发它更喜欢它。我所做的是设置 EOP字符,因此应用程序将缓冲,直到它读取EOP并仅记录完整的数据字符串一次并等待下一个 EOP字符以记录下一个数据。有关相关讨论,请参阅this SO post

在我的情况下,我将{CR+LF}(即运营商返回和新行)附加到我的数据字符串的每一端作为我的 EOP字符。每个数据串,例如"Hello world",已发送"Hello World{CR}{LF}"。在我设置端口,波特率和其他属性的代码中,我还设置了NewLine属性以匹配我为设备设置的 EOP字符

myPort.NewLine = "\r\n";

答案 3 :(得分:1)

好的,我找到了答案。数据是作为重复发送的,所以我无能为力。