Очистить буфер com порта linux

Обновлено: 06.07.2024

Serial Programming Guide for POSIX Operating Systems

5th Edition
Michael R. Sweet
Copyright 1994-1999, All Rights Reserved.
Перевод А.Гавва
2002 Львов

Данное руководство: "The Serial Programming Guide for POSIX Operating Systems" - покажет вам как правильно, эффективно и переносимо программировать последовательные порты на вашей рабочей станции UNIX® и/или PC. Каждая глава предусматривает примеры программ которые используют POSIX (Portable Standard for UNIX) функции управления терминалом, и которые, с минимальными изменениями, должны работать на IRIX®, HP-UX, SunOS®, Solaris®, Digital UNIX®, Linux®, и большинстве других UNIX-подобных операционных системах. Наибольшие различия, которые вы обнаружите, затрагивают имена файлов устройств последовательных портов и файлов блокировки.

Руководство содержит следующие главы и приложения:

  • Глава 1, Основы передачи данных по последовательным линиям
  • Глава 2, Конфигурирование последовательного порта
  • Глава 3, Связь через модем
  • Глава 4, Низкоуровневое программирование последовательного порта
  • Приложение A, RS-232 Pinouts
  • Приложение B, ASCII Control Codes

Г лава 1, Основы передачи данных по последовательным линиям

Эта глава является введением в передачу данных по последовательным линиям, RS-232 и другие стандарты которые используются для большинства компьютеров, а также о том как получить доступ к последовательным портам из C программы.

Ч то такое последовательная передача данных?

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

При последовательной передаче, каждое пересылаемое слово (байт или символ) данных посылается побитно. Каждый бит имеет состояние on ( 1 ) или off ( 0 ). Другие возможные термины: mark для состояния on и space для состояния off .

Очень часто скорость последовательной передачи данных выражается в количестве битов переданных за секунду (bits-per-second / "bps") или в бодах ("baud"). Это представляет только количество единиц и нулей которые могут быть переданы в течение одной секунды. На заре компьютерной техники, скорость передачи в 300 бод считалась достаточно быстрой, но в наше время компютеры могут обеспечить скорость передачи по RS-232 вплоть до 430,800 бод! Возможно, когда скорость передачи достигает 1,000, вы видите скорость показываемую в кило бодах, или kbps (т.е. 9.6k, 19.2k, и т.д.). Для скоростей выше 1,000,000 значения показываются в мега бодах, или Mbps (т.е. 1.5Mbps).

Когда говорят об устройствах последовательной передачи или о последовательных портах, их называют как Data Communications Equipment ("DCE") или Data Terminal Equipment ("DTE"). Различие между ними в том, что каждая сигнальная пара приема и передачи у них поменяна местами. При подключении двух DTE (или двух DCE) используется нуль-модемный кабель или адаптер, который меняет местами сигнальные пары приема и передачи.

Ч то такое RS-232?

RS-232 - это стандартный электрический интерфейс для последовательной передачи данных, объявленный Electronic Industries Association ("EIA") . Реально, RS-232 встречается с тремя различными особенностями (A, B, и C) каждая из которых объявляет различный диапазон напряжений для уровней on и off . Наиболее часто встречаемая разновидность - RS-232C, которая объявляет уровень mark bit ( on ) как напряжение между -3V и -12V, и уровень space bit ( off ) как напряжение между +3V и +12V. Спецификация RS-232C говорит, что эти сигналы могут распространяться на расстояние до 25 футов (8 метров). Обычно вы можете передавать сигналы немного дальше, но при этом понижается скорость передачи.

Кроме сигналов принимаемых и передаваемых данных, существуют другие сигналы, предусматривающие синхронизацию, состояние и квитирование:

Таблица 1 - Назначение выводов RS-232

DSR - Data Set Ready

Signal Quality Detect

TXD - Transmitted Data

GND - Logic Ground

RXD - Received Data

DCD - Data Carrier Detect

Data Rate Select

RTS - Request To Send

CTS - Clear To Send

DTR - Data Terminal Ready

Также, вы можете встретить еще два стандарта на последовательный интерфейс: RS-422 и RS-574. RS-422 использует более низкое напряжение и дифференциальные сигналы, что позволяет увеличить длину кабеля до 1000 футов (300 метров). RS-574 описывает 9-контактный последовательный PC разъем и напряжения.

О писание сигналов

Стандарт RS-232 описывает 18 различных сигналов для обеспечения последовательного обмена. Однако, только шесть из них реально доступны в окружении UNIX.

GND - Logic Ground (логическая земля)

Технически, логическая земля сигналом не является, без нее ни один из других сигналов не будет работать.

TXD - Transmitted Data (передача данных)

Сигнал TXD содержит данные передаваемые с вашей рабочей станции на компьютер или устройство, подключенное к другому концу линии (например, модем). Напряжение уровня mark ( on ) интерпретируется как значение 1, а напряжение уровня space ( off ) интерпретируется как значение 0.

RXD - Received Data (прием данных)

Сигнал RXD содержит данные передаваемые с компьютера или устройства, подключенного к другому концу линии, на вашу рабочую станцию. Также как и в случае сигнала TXD уровни mark и space интерпретируются как значения 1 и 0, соответственно.

DCD - Data Carrier Detect (обнаружение несущей удаленного модема/устройства)

Сигнал DCD принимается от компьютера или устройства, подключенного к другому концу линии. Уровень space ( off ) индицирует, что компьютер или устройство в текущий момент подключено к линии. Сигнал DCD не всегда используется и не всегда присутствует в реализации.

DTR - Data Terminal Ready (готовность терминала к передаче данных)

Сигнал DTR генерируется вашей рабочей станцией и указывает компьютеру или устройству, подключенному к другому концу линии, что вы готовы (уровень space ( off )) или не готовы (уровень mark ( on )) к передаче данных. Обычно сигдал DTR автоматически устанавливается в состояние готовности когда вы открываете (open) последовательный интерфейс вашей рабочей станции.

CTS - Clear To Send (разрешение передачи данных терминалу)

Сигнал CTS принимается с другого конца последовательной линии. Уровень space ( off ) индицирует готовность к посылке последовательных данных с вашей рабочей станции.

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

RTS - Request To Send (запрос на передачу)

Сигнал RTS, установленный в состояние уровня space ( off ) вашей рабочей станции, указывает о готовности вашей рабочей станции к пересылке данных.

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

А синхронная передача

Для того чтобы компьютер правильно "понимал" приходящие к нему последовательные данные, необходим какой-то способ определения где завершается передача одного символа и начинается передача нового символа. Это руководство описывает исключительно асинхронную передачу данных.

В асинхронном режиме, линия последовательной передачи данных остается в состоянии mark (1) пока нет передачи символа. start -бит предшествует передаче каждого символа и немедленно сопровождается битами передаваемого символа, одним опциональным битом четности, и одним или более stop -битами. start -бит всегда передается уровнем space (0), и указывает компьютеру, что доступны новые данные для последовательной передачи. Данные могут быть посланы или приняты в любой момент времени, поэтому передача называется асинхронной.

Рисунок 1 - Асинхронная передача данных



Опциональный бит четности - это простая сумма битов данных, которая индицирует что данные содержат или не содержат четное или нечетное число единичных битов. При при установке передачи четной четности ( even parity ), бит четности равен 0 если в переданом символе четное число единичных битов. При при установке передачи нечетной четности ( odd parity ), бит четности равен 0 если в переданных данных нечетное число единичных битов. Вы также можете встретить термины: space parity , mark parity , и no parity . Space parity подразумевает, что бит четности всегда равен 0. Mark parity подразумевает, что бит четности всегда равен 1. No parity подразумевает, что бит четности отсутствует и не передается.

Оставшиеся биты называются stop -битами. Может быть представлено 1, 1.5, или 2 стоп-бита между передаваемыми символами. Стоп-биты всегда имеют значение 1. Традиционно, стоп-биты использовались для того, чтобы дать компьютеру время для обработки предидущего переданного символа, но в настоящее время стоп-биты используются только для синхронизации передачи данных.

Формат передачи асинхронных данных обычно выражается как "8N1", "7E1", и т.д. Это указывает "8 битов данных, нет четности, 1 стоп-бит", и "7 битов данных, четная (even) четность, 1 стоп-бит" соответственно.

Ч то такое дуплексная и полудуплексная передача?

Full duplex (полный дуплекс) подразумевает, что компьютер может одновременно передавать и принимать данные - существует два раздельных канала данных (один для входящих данных, и один для исходящих).

Half duplex (полудуплекс) подразумевает, что компьютер не может одновременно передавать и/или принимать данные. Обычно это подразумевает, что существует только один канал передачи данных. Однако, это не подразумевает, что любой из сигналов RS-232 не используется. Скорее это подразумевает, что комуникационная линия использует какой-нибудь другой стандарт, отличный от RS-232, который не поддерживает полнодуплекснуюработу.

У правление потоком передачи данных (Flow Control)

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

Первый метод, часто называемый как "программное" управление потоком передачи данных ("software" flow control), использует специальные символы для начала (XON или DC1, восьмеричное значение 021) или остановки (XOFF или DC3, восьмеричное значение 023) передачи данных. Эти символы объявлены в American Standard Code for Information Interchange ("ASCII") . Эти коды полезны при передаче текстовой информации, однако они не могут быть использованы припередаче других типов данных без дополнительного специального программирования.

Второй метод, называемый как "аппаратное" управление потоком передачи данных ("hardware" flow control), вместо специальных символов использует сигналы CTS и RTS интерфейса RS-232. Приемник устанавливает CTS в уровень space ( off ) когда он готов к приему последующих данных и в уровень mark ( on ) когда он не готов. Также, передатчик устанавливает RTS в уровень space ( off ) когда он готов к передаче последующих данных. Поскольку аппаратный метод управления потоком использует различные сигналы он намного быстрее программного метода, которому требуется пересылка множества битов для выполнения той же задачи. Однако, CTS/RTS управление потоком не всегда поддерживается аппаратной частью или операционной системой.

Ч то такое Break?

Обычно, сигнал приема или посылки данных находится в состоянии уровня mark ( on ) до начала передачи нового символа. Если сигнал переходит в состояние уровня space ( off ) на длительный период времени, обычно от 1/4 до 1/2 секунды, то говорят о возникновении условия break .

Иногда break используется для переустановки (сброса) коммуникационной линии или изменения режима работы коммуникационного оборудования подобного модему. Глава 3, Управление модемом описывает это более подробно.

С инхронная передача

В отличие от асинхронных данных, синхронные данные появляются как постоянный поток битов. Для чтения данных линии, компьютер должен предоставлять или принимать общую синхронизацию битов, таким образом оба, приемник и передатчик, синхронизируются.

Даже при такой синхронизации компьютер должен каким-нибудь образом обозначать начало данных. Наиболее общий способ решения этой задачи - использование пакетного протокола передачи данных, подобного Serial Data Link Control ("SDLC") или High-Speed Data Link Control ("HDLC").

Каждый протокол объявляет определенные битовые последовательности для представления начала и конца пакета данных. Каждый протокол также описывает битовые последовательности которые используются при отсутствии данных. Эти битовые последовательности позволяют компьютеру обнаружить начало пакета данных.

Поскольку протоколы синхронной передачи не используют биты посимвольной синхронизации, они предоставляют как минимум 25% увеличение производительности по сравнению с асинхронной передачей данных, и пригодны для удаленной сетевой работы и конфигурирования более чем двух последовательных интерфейсов.

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

Д оступ к последовательным портам

Подобно всем устройствам, UNIX предоставляет доступ к последовательным портам через файлы устройств ( device files ). Для доступа к последовательному порту вы просто открываете соответствующий файл устройства.

Ф айлы последовательных портов

Каждый последовательный порт в системе UNIX имеет один или более файлов устройств (файлы в каталоге /dev ) ассоциированных с ним:

Прежде чем выполнять некоторую работу по бенчмаркингу, как бы освободить память (ОЗУ), которую Ядро Linux потребляет для своих буферов и кешей?

Обратите внимание, что это в основном полезно для бенчмаркинга. Опорожнение буферов и кеш снижает производительность ! Если вы здесь, потому что считаете, что освобождение буферов и кеша было положительным, перейдите и прочитайте Linux, питающийся моей оперативной памятью! . Краткая история: свободная память - неиспользуемая память - это потраченная впустую память.

1 ответ

Опорожнение кеша буферов

Если вы когда-либо захотите его очистить, вы можете использовать эту цепочку команд.

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

Чтобы освободить pagecache:

Чтобы освободить шпалы и иноды:

Чтобы освободить pagecache, dentries и inodes:

Вышеупомянутые должны выполняться как root. Если вы пытаетесь сделать это с помощью sudo , вам нужно немного изменить синтаксис примерно так:

ПРИМЕЧАНИЕ. . Если вы используете это:

более эзотерическая версия приведенной выше команды.

Почему изменение синтаксиса? Программа /bin/echo работает от имени root, из-за sudo , но оболочка, перенаправляющая вывод echo в файл root-only, все еще работает как вы. В вашей текущей оболочке начинается перенаправление до sudo .

Увидеть, что находится в буферах и кеше

Посмотрите linux-ftools , если вы хотите анализировать содержимое буферов & кэш. В частности, если вы хотите посмотреть, какие файлы в настоящее время кэшируются.

fincore

С помощью этого инструмента вы можете видеть, какие файлы кэшируются в директории give.

С вышесказанным вы можете видеть, что есть несколько файлов * .MYD, * .MYI и * .frm, которые в настоящее время кэшируются.

Обмен

Если вы хотите очистить свой своп, вы можете использовать следующие команды.

linux-logo

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

Свободная память — неиспользуемая память — это потраченная память впустую.

Очистка кеша и буфер в Linux

Если вы хотите очистить в системе кеш и буфер, то вы можете использовать эту цепочку команд:

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

  • Чтобы освободить pagecache:
  • Чтобы освободить иноды:
  • Чтобы освободить pagecache, dentries и inodes:

ПРИМЕЧАНИЕ. Вышеупомянутые команды должны выполняться от root пользователя.

Если вы пытаетесь сделать это с помощью sudo , вам нужно немного изменить синтаксис, примерно так:

Либо в таком формате:

Увидеть, что находится в буферах и кеше

Посмотрите linux-ftools , если вы хотите анализировать содержимое буферов и кэша в вашей системе. В частности, если вы хотите посмотреть, какие файлы в настоящее время кэшируются.

fincore

С помощью этого инструмента вы можете видеть, какие файлы кэшируются в директории give.

Очистка swap в Linux

первым делом смотрим сколько занимает наш swap места:

В данном случае swap занимает 26 Мб из 8 Гб

Очистим swap следующей командой:

Затем используйте команду, чтобы посмотреть освободился ли swap:

Из вывода видно что swap теперь занимает 0 Мб.

Очистка memcached в Linux

Есть несколько путей очистить кеша memcached.

Первый — это очистка с помощью подключения через telnet. Используем следующие команды:

  • localhost — хост где находится memcached (можно указывать и IP-адрес хоста).
  • 11211 — порт который использует memcached.

Чтобы узнать порт и IP-адрес в терминале где установлен memcached наберите следующее:

Второй — перезапустить сервис memcached:

Третий — установить утилиту memcflush для очистки кешей:

Теперь очищаем кеш memcached

Если есть вопросы, то пишем в комментариях.

Также можете вступить в Телеграм канал, ВК или подписаться на Twitter. Ссылки в шапки страницы.
Заранее всем спасибо.

Это то, что моя функция выглядит как открыть последовательный порт (используя Ubuntu 12.04):

В чем проблема, когда я запускаю эту программу, и если мое последовательное устройство уже подключено, в буфере есть контент. Мне нужно очистить буфер, прежде чем я начну читать его. Я думал, что использование tcsetattr(fd, TCSAFLUSH, &options); поможет устранить эту проблему, сбросив буферы ввода-вывода до инициализации порта, но не удачи. Любое понимание?

c linux serial-port flush

3 ответа

17 capcom [2012-10-22 17:38:00]

Думаю, я понял это. По какой-то причине мне нужно добавить задержку перед промывкой. Эти две строки, добавленные перед возвратом fd , похоже, сделали трюк:

3 Robert [2016-07-13 15:50:00]

Причиной этой проблемы является использование последовательного порта USB. Если вы используете обычный последовательный порт, у вас не будет этой проблемы.

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

См. также Greg ответ на аналогичную проблему, о которой сообщалось ранее здесь.

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

У меня были подобные симптомы с платой Arduino Uno, которая сбрасывается на open(). Я получал данные после вызова open(), который был создан до того, как плата Arduino была reset и, таким образом, до вызова функции open().

Отслеживая проблему с помощью вызовов ioctl(), я узнал, что данные просто не пришли во входной буфер к тому времени, когда был вызван tcflush(). Таким образом, tcflush() действительно работал, но не было данных для очистки. Сон 1000 нас после вызова open(), похоже, решил проблему. Это связано с тем, что задержка позволила получить данные до того, как был вызван tcflush(), и поэтому tcflush() действительно сбросил входной буфер.

Читайте также: