Могу ли я очищать последовательный порт каждый раз после считывания данных с него? - PullRequest
1 голос
/ 01 июня 2010

мне нужно очистить данные на последовательном порту, когда я прочитал данные с него, прежде чем я снова прочитал данные? я использую c / c ++ на windows xp

как я могу это сделать?

Спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 01 июня 2010

Очистка приемного буфера почти всегда неверна. Связь через последовательный порт носит асинхронный характер, вы рискуете удалить хорошие данные. Только если вы используете протокол «ведущий-ведомый» (устройство только когда-либо передает, когда запрашивается хостом) разрешит очистку. Но затем, если в приемном буфере действительно есть данные для очистки, вы игнорируете нарушение протокола, что вы никогда не хотите просто игнорировать.

Надежная связь через последовательный порт требует протокола. Контрольная сумма для проверки целостности сообщения и квитирования ACK / NAK для восстановления после повреждения данных. Посмотрите протокол RATP, описанный в RFC 916. Кстати, широко игнорируется, но я использовал его в прошлом. Его единственная слабость - буферизованные попытки соединения.

1 голос
/ 21 марта 2014

Следующее решение не является лучшим, но оно подходит для многих случаев:

Считывание большого количества байтов из последовательного порта, делая его пустым. Например:

ReadFile (порт, ТМП, 4096, & ioread, NULL);

tmp []: переменная, которая будет содержать данные, которые вам не нужны (сбросить данные) ioread: число прочитанных байтов

Таким образом, выше будет читать 4096 байт из последовательного порта. Вы можете увеличить число, чтобы убедиться, что после оператора вы получите чистый порт.

P.S. Я использовал это с Visual Studio 2010, C ++, Windows 7 - 64 бит

1 голос
/ 01 июня 2010

Стандарт C ++ имеет интерфейсы для записи в файлы, на экран и в журнал. Он также имеет интерфейсы для чтения из файлов и чтения со «стандартного ввода». Не существует стандартного способа взаимодействия с последовательными портами, сетевыми подключениями и т. Д.

К счастью, ваша операционная система или платформа будет иметь интерфейс для этого. Но (1) то, что вам нужно сделать, чтобы читать из последовательного соединения, и (2) что вам нужно сделать между последовательными чтениями, и (3) как это сделать, все зависит от платформы.


Глядя на некоторую документацию Microsoft , вам вообще не нужно "очищать порт". Но когда установлен флаг, чтобы что-то сигнализировать - например, что произошла ошибка - тогда вам нужно сбросить флаг, прежде чем продолжить. Конечно, вы сбрасываете флаг после , обрабатывая все, что этот флаг должен был сигнализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...