【问题标题】:Serial Port DataReceived Event Firing Only Once in Compact Framework串行端口 DataReceived 事件在 Compact Framework 中仅触发一次
【发布时间】:2012-03-13 13:17:59
【问题描述】:

我们正在.net compact framework 3.5 上开发 WinCE SerialPort 应用程序。

在 serialPort 类中,我们有 DataReceived 事件,不幸的是它只触发了一次。

我们的串口设置如下:

    _com = new SerialPort();
            _com.PortName = str_comport;
            _com.BaudRate = pBaudRate;
            _com.ReadTimeout = 1000 * 10 * 1;
            _com.WriteTimeout = 1000 * 10 * 1;
            _com.Handshake = Handshake.None;
            _com.ReceivedBytesThreshold = 1;
            _com.RtsEnable = true;
            _com.DtrEnable = true;
            _com.Parity = pParity;
            _com.DataBits = pDataBits;
            _com.StopBits = pStopBits;
            _com.DataReceived += new SerialDataReceivedEventHandler(this.Receive);
    _com.Open();

....

private void Receive(object sender, SerialDataReceivedEventArgs e) 
{ 
    _receivedString = _port.ReadExisting(); 
    _log.WriteFile("RX : " + _receivedString); 
}

我们尝试过先打开端口并附加接收到的数据事件,但没有用。

同样的代码在 Windows XP/Windows 7 机器上运行良好。可能的原因是什么。

【问题讨论】:

  • 当您的 DataReceived 事件处理程序方法由于某种原因未完成时,通常会发生这种情况。从这里看不到。
  • 在我的接收方法中,我将记录正在获取的数据。私人无效接收(对象发送者,SerialDataReceivedEventArgs e){_receivedString = _port.ReadExisting(); _log.WriteFile("RX : " + _receivedString); }

标签: c# compact-framework


【解决方案1】:

我们需要更多地了解您的期望和传入的数据是什么样的。你的Receive 方法是什么样的?

ReceivedBytesThreshold 可以被认为是输入缓冲区上的触发点。当缓冲区大小超过该值时,仅在向前的方向上,您会收到一个事件。在这种情况下,这意味着当接收缓冲区大小从 0 字节变为 1 字节时,您将收到一个事件。你不会从 200 到 201 中得到一个。你也不会得到每个字节的事件。

因此,为了使其有效,当您接收到事件时,您需要从缓冲区中读取所有数据,将其大小恢复为零并有效地“重置”事件触发器。

【讨论】:

  • 私人无效接收(对象发送者,SerialDataReceivedEventArgs e){_receivedString = _port.ReadExisting(); _log.WriteFile("RX : " + _receivedString); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多