Буфер последовательного порта / Скорость передачи / Потерянные данные

Я использую следующий фрагмент кода для отправки данных GPS через com-порт раз в секунду:

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 данных из этой записи записи. То же самое происходит с замазкой тоже.

Я попытался разделить запись записи в 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 способен передавать все эти данные в одном пакете.

ВОПРОС:

Кто-нибудь знает, почему мое чтение берет только 254 байта данных, когда я записываю 504 байта данных в поток? Есть ли какое-то ограничение на

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);
}

1 ответ

Решение

Подождите, вы заявили, что использовали одну секунду, но ваш код выглядит так:

serialPort.WriteTimeout = 500;

Это тайм-аут на половину секунды для отправляющей стороны. А при скорости 4,8 Кбит / с (что, как вы заявляете, примерно 480 символов в секунду), этого времени достаточно, чтобы отправить около 240 символов.

Может случиться так, что GPS может сделать это, потому что у него нет тайм-аута на полсекунды.

Попробуйте немного увеличить время ожидания и посмотреть, что произойдет - пять секунд дадут вам достаточно места для тестирования. При скорости 4,8 Кбит / с для 504 байтов потребуется чуть больше секунды для полной передачи.

И быть уверенным, что ты действительно не хочешь рукопожатия? Отсутствие этого также может привести к потере данных в будущем.

Другие вопросы по тегам