首页 > 解决方案 > 为什么我的 serial.write 发送数据两次

问题描述

我试图通过创建一个应用程序来模拟通过串行端口发送数据的微控制器,该应用程序通过接收例程将字节连续发送到另一个应用程序以用于 GUI 目的。

我正在使用这种方法从发送者实例发送我的字节:

Write(vout, 0, 13);

其中 Write 定义为:

public void Write(byte[] buffer, int offset, int count)
{
    // preconditions checks are omitted
    serialPort1.Write(buffer, offset, count);
}

vout是我从实时模拟传感器的数据中手动填充的字节数组。

在 GUI 应用程序中接收数据时,我使用的是:

private void comport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
      if (!comport.IsOpen) return;
      int bytes = comport.BytesToRead;
      //For loop for getting all values in buffer to 0
      comport.Read(buffer, 0, 13);
      Update_counter();//Updates counter by 1.
}

第二次/之后的任何时候我发送一些东西,它被发送了两次,或者至少这是我的计数器变量所暗示的。

我不确定这是否与实际的串行缓冲区有关,或者我是否错误地使用了写入和读取方法。

另外,我将 COMPORT 设置为 9600 波特率、8 位、停止位 1、奇偶校验无。

任何帮助表示赞赏。

标签: c#winformsserial-port

解决方案


问题的原因是,您读取的字节数比现在可用的字节数多:

int nrOfAvailableBytes = comport.BytesToRead;
comport.Read(buffer, 0, 13);

因此,即使comport 告诉您只有一个字节可用,您还是决定读取13 个字节。

SerialPort.Read告诉你:

如果 count 大于输入缓冲区中的字节数,则读取的字节数会更少。

解决方案:只读取当前可用的字节。


推荐阅读