# Ошибки передачи

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

Ошибки, инициируемые асинхронным приемопередатчиком, передаются от драйвера COM-порта Windows системе Аргус через стандартные средства интерфейса Win32. Система Аргус, в свою очередь, сообщает об этих ошибках в хронологическом журнале, приблизительно в следующей форме:

`ComError CE_FRAME, In=8b, OutB=0b`

“CE_FRAME” — это один из возможных типов ошибок, возвращаемых драйвером Windows, “InB”/”OutB” — число байт, находившихся в буферах приема и передачи в момент возникновения ошибки. Одновременно может возникнуть несколько типов ошибок, в этом случае они будут перечислены в той же строке, отделенные символом ‹|›

Следующие четыре типа ошибок инициируются самим асинхронным приемопередатчиком. Эти ошибки подробно описаны далее.

    CE_BREAK
| The hardware detected a break condition
    CE_FRAME
| The hardware detected a framing error
    CE_RXPARITY
| The hardware detected a parity error
    CE_OVERRUN
| A character-buffer overrun has occurred — the next character is lost

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

    CE_RXOVER
| An input buffer overflow has occurred
    CE_TXFULL
| The application tried to transmit a character, but the output buffer was full

Драйвер Windows, по спецификации, может возвращать еще некоторые ошибки, которые на практике работы системы Аргус возникать не могут. Ограничимся лишь перечислением:

    CE_IOE
| An I/O error occurred during communications with the device
    CE_MODE
| The requested mode is not supported
    CE_DNS
| Windows 95 only: A parallel device is not selected
    CE_OOP
| Windows 95 only: A parallel device signalled that it is out of paper
    CE_PTO
| Windows 95 only: A time-out occurred on a parallel device

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

Остановимся подробнее на ошибках, инициируемых самим асинхронным приемопередатчиком.

Ошибка переполнения (`CE_OVERRUN`)

Ошибка переполнения (UART Overrun Error) свидетельствует о том, что второй байт поступил по последовательному порту до извлечения первого. Как правило, это означает, что линия инициализирована на слишком большую скорость, и драйвер COM-порта не успевает обрабатывать поток. Решением проблемы обычно является снижение скорости передачи до тех пор, пока ошибки не исчезнут. Однако появление таких ошибок на скорости ниже 19200 бод служит поводом искать причины в другом. Какой-нибудь Windows-процесс/сервис/драйвер может оставлять аппаратные прерывания запрещенными на длительный период времени или работать с очень большим приоритетом, не оставляя процессорного времени драйверу COM-порта.

Ошибки четности (`CE_RXPARITY`)

Ошибки четности (parity errors) возникают тогда, когда принятый бит контроля четности не соответствует вычисленному биту. Например, если принимается бит “Odd”, а вычисляется “Even”, асинхронный приемопередатчик инициирует ошибку четности. Чаще всего, причиной возникновения ошибок четности является несогласованность между приемником и передатчиком в установленном методе контроля четности. Ошибки могут возникнуть сразу после того, как вы подсоединили новое устройство, не согласовав с ним метод контроля четности. Другим проявлением несогласованности может стать факт постоянного возникновения ошибок при передаче определенных символов, и полным отсутствием ошибок при передаче других.

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

Сбои кадра (`CE_FRAME`)

Сбои кадра (framing errors) происходят тогда, когда биты данных в последовательном потоке не завершаются корректным стоповым битом, который всегда должен иметь значение ‹1›. Как и в случае ошибок четности, сбои кадра обычно возникают вследствие несоответствия параметров линии между приемником и передатчиком. Получив сбои кадра, проверьте параметры обоих сторон. Сбои кадра, чаще, чем ошибки четности, могут быть вызваны электрическими помехами. И снова решением проблемы может стать укорачивание кабеля, и удаление его от источников помех.

Разрыв (`CE_BREAK`)

Разрыв (Break), на самом деле, не является ошибкой приема или передачи — он представляет особое состояние линии. “Разрыв линии” или просто “разрыв”, это такое условие, при котором нулевые биты передаются подряд в течение времени, большего или равному времени передачи байта. Асинхронный приемопередатчик распознает это состояние и может сообщать системе Аргус через драйвер COM-порта факт разрыва линии. Разрывы предназначены для оповещения устройства о том, что ему необходимо отработать особое состояние. В коммуникациях системы Аргус сигнал разрыва специально не применяется, но он, как и в случаях со сбоями кадра и ошибками четности, может возникать как следствие помех или несогласованности устройств.