【问题标题】:Duplicate data received on Serial Port串口收到重复数据
【发布时间】:2011-12-21 02:25:32
【问题描述】:

我正在使用 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

【问题讨论】:

  • 你能展示完整的(缩减的、可编译的)代码吗?

标签: c#


【解决方案1】:

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

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

同时,请确保您只注册一次活动......

【讨论】:

  • 阈值应该设置为多少?示例数据就像“P25:T0001:80900259025A0259025AD14C”每一行都是那么长。
【解决方案2】:

您必须立即读取所有可用数据。不要使用 ReadLine,因为不清楚设备使用哪个字符来发送 LF 或 CR,或者是否将它们发送给您。而是使用这个:

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

  string line = _sp.ReadExisting();

【讨论】:

  • I'm getting duplicate data with _sp.ReadExisting(); the data is P25:T0001:160000C00055FFFF0001CC47 P25:T0001:BD001325E032091B94C412AC P25:T0001:00900259025A0259025A3578 P25:T0001:020001870286005D00082D99 P25:T0001:89900B40000000000000D9CA P25:T0001: 05900000000000000000D1C3 P25:T0001:020001AF09F7018702866672 P25:T0001:BB0000BEE0014401B970E51E P25:T0001:3A00001144010101B97014D9 P25:T0001:160000C00055FFFF0001CC47 P25:T0001:BD000322D0320A2510A28794 P25:T0001:009002590259025A0259B299 P25:T0001:0200005D000801AF09F7E1BC
  • 好的,我找到了答案。数据作为重复发送,所以我无能为力。
  • 在准确读取可用字节之前的代码呢?将第一个读数存储在一个变量中,然后将其与第二个读数进行比较。 Readexisting 因为它也返回字符串,所以可以使用与 ReadLine 相同的代码。上面的代码是我正在使用的代码的复制/粘贴,它工作正常。另外,请确保您只分配了一名代表。
  • 我会使用第一个,但这意味着我必须在某个地方拆分所有 P25 段。这不会改变我的结果,因为看起来警察扫描仪无论如何都在输出双打(我查看了 Putty 的输出,结果相同)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我正在编写一个应用程序,它通过 USB 记录串行数据,并遇到了类似的问题,即我得到不完整(部分)数据、重复数据,以及最糟糕的情况,两者兼而有之。问题后来解决了。

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

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

    myPort.NewLine = "\r\n";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      相关资源
      最近更新 更多