Чтение из последовательного файла выводит мусор

#c #serial-port

#c #последовательный порт

Вопрос:

Я пытаюсь настроить последовательную связь между dsp и моим компьютером.

dsp отправляет значение 16-разрядного счетчика, которое увеличивается при каждой его отправке. Так что это просто подсчет…

Вот что я получаю на своем компьютере :

3335
3336
3337
3338
36388
46920
16372
46919
3339
3340
3341
3342
36388
46920
16372
46919
3343
3344
4621
3341
36388
46920

Итак, мы можем видеть счетчик, который прерывается этими 4 значениями, которые появляются из ниоткуда…

Моя программа настроена с

 fd = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, FNDELAY);
termios options;
tcgetattr(fd, amp;options);
cfsetispeed(amp;options, B4800);
cfsetospeed(amp;options, B4800);
options.c_cflag |= (CLOCAL | CREAD | CS8);
options.c_lflag amp;= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag |= (IXON | IXOFF | IXANY);
tcsetattr(fd, TCSANOW, amp;options);
  

DSP отправляет 4800 / 8N1.

Есть идеи?

Комментарии:

1. Где значения, преобразуемые из 16-битного двоичного файла в строки ASCII? До или после того, как они пройдут через последовательный порт?

Ответ №1:

Я сильно подозреваю, что они отправляются DSP, драйверы последовательного порта к настоящему времени довольно хорошо отлажены.

Другие возможности заключаются в том, что вы считываете последовательный порт из нескольких потоков одновременно (возможно, в одном процессе, возможно, нет). Откройте порт исключительно для того, чтобы убедиться, что это не ваша проблема.

Или вы могли бы считывать ожидаемые значения из последовательного порта и добавлять мусор в некоторую буферизацию / очередь внутри вашей программы. Возможно, вы получаете частичные чтения (из-за тайм-аута приема).

Помните, что возвращаемое значение read измеряется в байтах, а не в 16-битных значениях. Если бы вы получали 8 байт, а затем печатали 8 коротких строк, вы бы увидели подобное поведение. (Однако проблемы с двумя последними значениями, 4621 3341, в «последовательности», не могут быть объяснены таким образом.) Основываясь на комментариях из OP, это, по-видимому, является точной причиной проблемы

Ни в коем случае эта проблема не связана с конфигурацией последовательного порта.

Комментарии:

1. О, вы уже указали на мою проблему… Проблема с 4621 3341 может быть объяснена тем фактом, что буфер заполняется не полностью в каждом цикле.

Ответ №2:

Lol Мне очень жаль, причина проблемы была в другом, я делал

 unsigned short buffer[4];
n = read(..., buffer, ...); // n in bytes !
  

Затем

 for (int i = 0; i < n;   i) 
    dump << buffer[i] << std::endl;  // index in 16-bits !
  

Итак, я всегда считывал свой буфер из 4 элементов 4 значения (из стека, я думаю)…

Однако спасибо за ваши ответы…

Комментарии:

1. Должен ли я что-то сделать, чтобы закрыть вопрос?

2. Поскольку, похоже, я угадал правильно, вы можете «принять» мой ответ, щелкнув контур флажка. Это позволяет будущим читателям знать, что мой ответ смог решить вашу проблему. Вероятно, вам также следует изменить заголовок вашего вопроса, чтобы сделать его более точным, что-нибудь о дополнительных байтах мусора в данных с последовательного порта и т.д. Я обновил свой ответ, чтобы подчеркнуть, какое предположение было правильным.