Отправка строк заканчивается на [CR][LF]

Мое приложение отправляет строки NMEA, оканчивающиеся на [CR]+[LF]. Стандарт NMEA определяет этот формат (например, информация о курсе из гирокомпаса): '$HEHDT,2.0,T*2D[CR][LF]'. На приемном конце строка отбрасывается как неполная. Как мне добавить и отправить эти символы?

Отправка выполняется с использованием всего лишь нескольких строк кода (объект является Cp1tx: TIdUDPServer;):

...

    Cp1tx.Active:= true;
    Cp1tx.Broadcast(InStr,8051,'',IndyTextEncoding_8Bit);
    Cp1tx.Active:= false;

...

Кстати, я использую Delphi 10.1 Berlin.

4 ответа

Если предположить, что InStr - это строка, которую вы хотите отправить, это будет:

Cp1tx.Broadcast(InStr + #13#10, 8051, '', IndyTextEncoding_8Bit);

Есть разные способы выражения CRLF:

Instr := '$HEHDT,2.0,T*2D'#13#10;

Instr := '$HEHDT,2.0,T*2D'#$D#$A;

// CR and LF are defined in the IdGlobal unit
Instr := '$HEHDT,2.0,T*2D'+CR+LF;

// EOL is defined in the IdGlobal unit
Instr := '$HEHDT,2.0,T*2D'+EOL;

Всем спасибо. Я думаю, что сделал себя дураком. Теперь все работает нормально, независимо от того, как я добавляю символы CRLF.

Исторический комментарий: CRLF (и в таком порядке!) Был изобретен для использования в старых механических телексных машинах, приводимых в действие двигателем 1/2 л.с. Потребовалось время, чтобы переместить карету обратно в левое положение. Вот почему сначала посылается CR, а затем LF, поэтому у всех механиков есть время для выравнивания и подготовки к печати первого символа в новой строке.

Начинающие операторы телекса узнали это нелегко. Отправляя LF и CR, а затем печатая текст, ловушка застряла на пути влево, опечатанные рычаги запутались, и часто ведущая ось заклинило или сломалось. Помните, что это была высокоскоростная передача со скоростью 50 бод! Я провожу бесконечные часы в своем сервисе, ремонтируя сломанные телексные машины. Что ж, сейчас все по-другому и лучше, но мы все еще придерживаемся старого соглашения CRLF.

Когда мне нужно отправить CR+LF часто, я объявляю Const и обращаюсь к нему по мере необходимости.

Const
CRLF = #13+#10;

{ To use this do the following }

MyString := 'This string ends with a Carriage Return / Line Feed'+CRLF;

Вы также можете добавить возврат каретки / перевод строки, используя Chr(10)+Chr(13);

Например;

    MyString := 'This string also ends with a CRLF' + Chr(10) + Chr(13)
    + 'But it could equally end with an Escape Code' + Chr(27) // or #27

Я отредактировал свой ответ, потому что было указано, что у меня CR LF в неправильном порядке.

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