【问题标题】:Serial Port Buffer / Baud Rate / Lost data串口缓冲器/波特率/丢失数据
【发布时间】:2012-04-12 03:16:14
【问题描述】:

我正在使用以下代码 sn-p 每秒一次通过 com 端口发送 gps 数据:

serialPort = new SerialPort("COM4", 4800, Parity.None, 8, StopBits.One);
serialPort.Handshake = Handshake.None;
serialPort.WriteTimeout = 500;
serialPort.Open();

这一切都很好,但是使用以下方法写入串行端口时:

serialPort.Write(theString);

theString == 504 charactors我的阅读程序,使用:

  while (true) {
      Console.Write(serialPort.ReadExisting());
  }

只会从该写语句中读取254 bytes 的数据。 putty 也会出现同样的情况。

我已尝试将写入语句拆分为 254 字节大小的块并写入两次,但似乎第二次写入操作虽然已由我的写入程序确认为运行,但从未被读取程序读取。

我知道我的写缓冲区是4096 bytes,我的读缓冲区是2048 bytes

我的字符串是这样的:

$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPZDA,191500.00,11,04,12*60
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPMSS,999,999,200.0,4800,*56

当我尝试使用字符串中的每行一个写入语句写入缓冲区时,它会将所有内容写入缓冲区,但是,两个写入操作将在阅读器中交错,所以结果是这样的:

etc...
$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPZDA,191500.00,11,04,12*60
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPMSS,999,999,200.0,4800,*56
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
etc...

这对我来说没有任何意义,虽然在 9600 波特率下不会发生隔行扫描问题,(我假设是因为 4800 baud == 480bytes/s),改变波特率不是一种选择,并且以某种方式普通 GPS 能够传输一次性获取所有这些数据。

问题:

有谁知道为什么当我将 504 字节的数据写入流时,我的读取只获取 254 字节的数据? 是否有一些限制

serialPort.Write(Byte[], int offset, int count);

那不允许超过 254 个字节? (这不能解释第二次写操作没有完成)。

甚至。有谁知道写入串口的更好方法吗?


此方法似乎适用于提供的数据(尽管我最初的问题仍然存在):

string Sentence = "";
for (int i = 0; i < block_list[total_block].Count; i+=2) {
    Sentence = block_list[total_block][i] + block_list[total_block][i+1];
    serialPort.Write(Sentence);
}

【问题讨论】:

    标签: c# serial-port buffer baud-rate


    【解决方案1】:

    等一下,您说您使用了一秒超时,但您的代码显示为:

    serialPort.WriteTimeout = 500;
    

    这是发送端的半秒超时。在 4.8Kbps(如您所说,这大约是每秒 480 个字符)下,仅够发送大约 240 个字符的时间。

    这可能是 GPS 可以做到这一点因为它没有半秒超时。

    尝试将超时时间调高一点,看看会发生什么 - 五秒钟应该会给您足够的喘息空间来进行测试。在 4.8Kbps 时,504 字节的完整传输需要一秒多一点。

    确定你真的不想握手吗?缺乏这一点也可能导致数据丢失。

    【讨论】:

    • 我有一个计时器,它会每秒调用一次写入语句。由于我正在模拟真实设备,因此我无法控制任何属性,但是我认为写入超时是它尝试写入的时间,而不是它停止之前写入的实际时间。感谢您提供宝贵的信息,我有点惭愧我没有将写入超时与发送的数据联系起来!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多