Символы Ascii при определенном значении не читаются через серийный номер
Это фиктивный анализ недостатков вашей программы.
Как оказывается по некоторому совпадению, наибольшее полученное значение кажетсяравным 0xA5, и небольшой выборочный дамп, кажется, всегда предшествует этому байту либо с 0x0B, либо с 0x0C.
Если бы в дампе отображалось больше данных, в конечном итоге 0x0D (возврат каретки) предшествовал бы байту 0xA5?
Так, если активен канонический режим (который обычно является режимом по умолчанию) и ему предшествует 0x0D (то есть символ разделителя строк), то 0xA5
будет первым символом строки.
Так какваша программа запрашивает только один символ за раз, каноническое read () вернет только первый символ строки.
Что я делаю не так?
В вашей программе есть две существенные ошибки.
Во-первых, ваша программа пренебрегает настройкой последовательного терминала, поэтому вы не знаете, использует ли ваша программа канонический или неканонический режим.,
Во-вторых, ваша программа печатает одни и те же результаты только одного read () .
Ваш анализ того, что считываются только определенные значения, является неточным, потому что только результатна самом деле печатается read () .
printf () выходит за рамки цикла , в то время как (который выполняет чтение), поэтомуВаша программа не печатает то, что получил каждый read () , а печатает только то, что first успешно read () .
После этого первогоуспешное read () , переменная nread
имеет значение 1
, а сравнение nread < 1
для цикла , в то время как всегда будет иметь значение FALSE.
Следовательно, не более read () s будет происходить после первого успешного, но результаты первого будут неоднократно печататься из-за цикла для .
Так что если неКанонический режим активен, когда вы запустили свою программу, и «0xA5» как раз и является первымt read () , то это то, что будет напечатано (много раз) вашей программой.
Поскольку полученные данные являются двоичными, а не текстовыми ASCII, вам необходимо настроить последовательный терминал для неканонического (он же необработанного) режима.
Тогда вы сможете продолжать неэффективно читать один байт привремя.