Я знаю, что во многих случаях асинхронной связи пакет начинается со стартового бита.
Но начальный бит - это всего лишь 1 или 0. Как отличить начальный бит от конечного бита от последнего пакета?
Бывший. Если я выберу свой начальный бит равным 0, а мой конечный бит - 1. и я получаю 0 (поток данных A) 1 0 (поток данных B) 1, что мне мешает предположить, что существует поток данных C, который содержит то же содержимое «(поток данных A) 1 0 (поток данных B)»?
Разве не удобнее иметь начальный БАЙТ, а затем проверять поток данных на наличие этой комбинации битов? Это уменьшит возможность путаницы между начальным и конечным битами.


Отличный вопрос! В большинстве асинхронных коммуникаций также указывается бит останавливаться, который является дополнением к стартовому биту, гарантируя, что каждый новый символ начинается с перехода от остановки к началу.
Пример: давайте передадим символы ABC, которые являются ASCII 65, 66 и 67:
A = 65 = 0x41 = 0100 0001
B = 66 = 0x42 = 0100 0010
C = 67 = 0x43 = 0100 0011
Также предположим (произвольно), что стартовый бит - это 0, а стоповый бит - это 1, и данные передаются от MSB к LSB. Передатчик будет в состоянии остановки (1), когда данные не передаются. Итак, получатель может увидеть это:
Data: ....1111 0010000011 111 0010000101 0010000111 11111....
(quiet) ^ A $ ^ B $ ^ C $ (quiet)
Приносим извинения за графику ASCII, данные состоят из серии стоповых (1) битов, пока канал не используется. Когда передатчик готов к отправке символа, он отправляет стартовый бит (0) (помечен ^), за которым следует код символа и заканчивает стоповым битом (1) (помечен $). Он продолжает посылать стоповые биты до тех пор, пока не будет передан следующий символ, начиная с другого стартового бита.
Причина, по которой мы используем start биты вместо байты, - это эффективность. Приведенная выше схема требует 10 бит (1start + 8data + 1stop) для передачи 8 бит данных, в результате чего накладные расходы составляет (10-8) / 8 = 1/4 = 25%. Если бы мы использовали start и stop байты, нам нужно было бы передавать 3 байта для каждого байта данных, что было бы накладными расходами (3 - 1) / 1 = 2 = 200%. Если бы каждый байты начала, данных и остановки составляли 8 бит, нам пришлось бы передавать 24 бита вместо 10 для каждого символа, поэтому для отправки данных потребовалось бы почти в 2 1/2 раза больше времени!
Я никогда не видел, чтобы реализация вела себя так, как вы описываете, постоянно отправляя стоповые биты, пока линия неактивна, что не имеет никакого смысла.
Я специалист по аппаратному обеспечению. Если вы проверите напряжение на линии приема последовательного порта вашего ПК, всегда будет либо на уровне 0, либо на уровне 1 (или быстро переключается между ними). Задача стартового бита - принудительно перейти от «стоп», что аналогично «холостому ходу».
@Steve: Аппаратное обеспечение обычно заботится об этом за вас. Он простаивает, пока не обнаружит переход от остановки к запуску, затем он синхронизирует данные, при необходимости выполняет некоторую проверку ошибок, устанавливает флаг или генерирует прерывание, чтобы указать, что данные доступны, и ожидает следующего стартового бита. ..
... Как высокоуровневый программист, вы просто читаете данные, когда получаете сигнал о том, что они доступны, часто в цикле, пока HW не сообщит вам, что данные исчерпаны, а затем делаете что-то еще до следующего сигнала готовности данных.
Вот как обычно работают стартовые и стоповые биты:
Если необходимо отправить больше данных, каждый байт должен быть инициирован стартовым битом и завершен стоповым битом. Передатчик и приемник должны согласовать, сколько бит данных отправляется для каждого стартового бита, чтобы приемник мог отличить стоповый бит от данных. Иногда начальный бит на самом деле состоит из нескольких бит или даже байта, но идея та же. Получатель распознает конец кадра данных, когда он видит стоповый бит после получения заранее заданного количества битов данных. Иногда перед стоповым битом отправляется бит четности, чтобы обеспечить простой механизм обнаружения ошибок.
Все зависит от протокола. Вы можете сказать, что после символа запуска вы будете ожидать N символов или будете читать, пока не встретите символ остановки.
Где символ colud - любая n-битовая последовательность (включая бит и байт).
Действительно, ваш пример с битами в точности применим к протоколу, который использует байты вместо битов.
Допустим, вы отправляете поток 00000000 A 11111111 00000000 поток B 11111111. В этом случае вы все равно можете спутать его с потоком C = поток A 11111111 00000000 поток B.
Обычно используется стартовый бит, потому что изменение уровня напряжения может вызвать событие (см. Запуск по фронту в шлепки.) С другой стороны, стартовый символ с несколькими битами будет использоваться для синхронизации часов двух систем в дополнение к запуску события. Примером этого может быть сигнал PAL.
Стартовый и стоповый биты взяты из дней телетайпы. По сути, это были импульсы, которые требовали времени, чтобы позволить механическому оборудованию настроиться. Строки текстового файла DOS заканчиваются CR LF, что буквально заставляет каретку вернуться в столбец 1, а валик продвинуться на одну строку. Я думаю, что это в порядке, потому что для выполнения CR требуется больше времени, а LF может эффективно выполняться параллельно.
Обнаружить это немного сложнее. Вы вроде как должны смотреть, как проходит поток битов. Со временем вы сможете обнаружить это, поскольку данные обычно представляют собой ASCII с начальными / стоповыми битами вокруг них. Обычно это не проблема, потому что это обрабатывается UART, который запускает порт COM.
Вы можете спутать стартовые и стоповые биты с символами задания скорости, которые предназначены для задержки передачи до тех пор, пока оборудование не «догонит» их. Стартовые и стоповые биты предназначены строго для синхронизации приемника с передатчиком, поэтому он «ищет» каждый бит в нужное время.
И я оставляю это как предупреждение другим.
Похоже, что в вашем примере есть "тихая" фаза / фаза ожидания. Могу ли я проверить это в программе с помощью тайм-аута?