LINUX.ORG.RU

программно настроить последовательный порт


0

0

Пишу приложение обмена по RS-485 в для embedded системы на базе uclinux'a. По этому интерфейсу бегает проприетарный протокол, в котором предусмотрены свои старт/стоп биты при передаче. Соответственно мне нужно отключить установку этих битиков драйвером порта, так? Сделал вот так:

int fd;
    struct termios  oldTermios, newTermios;

    if ((fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) {
        return -1;
    }

    if (tcgetattr(fd, &oldTermios) < 0) {
        return -1;
    }

    memset(&newTermios, 0, sizeof(struct termios));

    newTermios.c_cflag  = CS8 | CLOCAL | CREAD | UART_DEFAULT_BAUD;
    newTermios.c_iflag  = IGNPAR;
    newTermios.c_oflag  = 0;
    newTermios.c_lflag  = 0;
    newTermios.c_cc[VTIME]  = 0;
    newTermios.c_cc[VMIN]   = 0;

    if (tcsetattr(fd, TCSANOW, &newTermios) < 0) {
        return -1;
    }

    if (tcflush(fd, TCIOFLUSH) < 0) {
        return -1;
    }

Но осциллографом вижу, что все равно добавляются стандартные стартовые биты, а не те что определены протоколом.

Похоже что-то я упустил, что я делаю не так?

★★

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

З.Ы. Код особо не читал...

Zhbert ★★★★★
()
Ответ на: комментарий от anon_666

>Зачем сразу асм? Какой профит от него?

Хз, но это был первый язык, на котором я прогал, для пикмикро =)

Zhbert ★★★★★
()

AFAIK, большинство стандартных реализаций RS-485 построены на основе RS-232, где старт-стоп биты являются неотъемлемой частью и возможность не генерировать их не предусмотрена. Если само железо на эмбеддед системе позволяет это сделать - можно расширить драйвер соответствующим ioctl().

RVictor
()
Ответ на: комментарий от RVictor

> AFAIK, большинство стандартных реализаций RS-485 построены на основе RS-232, где старт-стоп биты являются неотъемлемой частью и возможность не генерировать их не предусмотрена. Если само железо на > эмбеддед системе позволяет это сделать - можно расширить драйвер соответствующим ioctl().

Я тоже об этом подумал, только не совсем понимаю, какой именно драйвер (слой ядра) править. Дело в том что на платформе установлен чип-конвертер из usb в cерийный интерфейс, дравер чипа ftdi_sio есть в стандартном ядре, драйвер обеспечивает ioctl для tcsetattr(), но как я понимаю реальная установка параметров (скорость, количество битов на символ, старт/стоп биты и пр.) происходит где-то на tty-уровне ядра?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

> чип-конвертер из usb в cерийный интерфейс, дравер чипа ftdi_sio

Я бы начинал с документации на чип конвертера FTDI - если там отсутствует нужная функциональность управления старт/стоп битами, то оп-па - будут проблемы, надо будет искать другое решение. Если она есть - переместиться на уровень стандартного драйвера и, при отсутствии готового коде дописАть свой.

ЗЫ: я, правда, ни разу не встречал протокол на RS485/422, в котором не было бы старт/стоп битов или же они отличались от RS232.

RVictor
()

> По этому интерфейсу бегает проприетарный протокол, в котором предусмотрены свои старт/стоп биты при передаче. Соответственно мне нужно отключить установку этих битиков драйвером порта, так?

Нет, не так. Старт/стоп-биты - часть интерфейса, по которому бегает твой протокол. Что там внутри протокола уже не имеет отношения к самому интерфейсу.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Нет, не так. Старт/стоп-биты - часть интерфейса, по которому бегает твой протокол. Что там внутри протокола уже не имеет отношения к самому интерфейсу.

Т.е. старт/стоп биты неотъемлемая часть интерфейса? Но, насколько я знаю, по стандарту rs232 каждые 7 или 8 битов обрамляются «старт» и «стоп» битами соответственно. Этот проприетарный протокол организует посылки по 11байт и по осциллографу видно, что stop/start битов там нет.

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

В rs232 да, старт-стоп биты обязательны ибо используются как минимум для синхронизации. А что, описания «пропиетарного» протокола нет - раз ты осциллограф пользуешь? Может, эти 88 бит на проводе - это таки 11 6-битных слов со старт/стопом?

RVictor
()
Ответ на: комментарий от RVictor

описание очень скудное и про старт/стопы ничего не говорит, просто оговаривает фиксированные значения первых 8 бйтов и они всегда, судя по осциллографу, именно те что приведены в доке: первый байт 0xf7, второй 0x0b и т.д.

cruz7 ★★
() автор топика
Ответ на: комментарий от pathfinder

Если что-то назвали RS232/422/485, то это обязательно должен быть асинхронный интерфейс? Я всегда думал, что нет.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Из http://ru.wikipedia.org/wiki/RS-232:

RS-232 (англ. Recommended Standard 232) — в телекоммуникациях, стандарт последовательной синхронной и асинхронной передачи двоичных данных

синхронной и асинхронной передачи

pathfinder ★★★★
()
Ответ на: комментарий от RVictor

> Давай скриншот первых двух байтов :)

Пардон, был неправ — просмотрел стартовые и стоповые биты на экране осцилллографа, а они там таки есть! Но вот исходя и описания http://ru.wikipedia.org/wiki/RS485 синхробитs в RS485 не оговариваются, т.е. они могут быть, а могут и не быть, оставляется на усмотрение более верхних протоколов, получается так?

cruz7 ★★
() автор топика
Ответ на: комментарий от pathfinder

Хоть сам стандарт (что RS232, что 422/485) формально определяет только электрические характеристики и назначение линий, он практически определяет асинхронность протокола тем, что линий синхронизации (data clock) там нет (см синхронные протоколы типа I2C/SPI/SSP). Синхронизация приёмника с передатчиком происходит посредством первоначального изменения/изменений линии данных - тот самый старт-бит. Он может быть отдельным для каждого байта, или же только в начале последовательности байт (как в ethernet протоколе) - но он есть. Попытки использовать сигналы DCE/DTR для того самого data clock'а не прижились из-за несовместимости.

А то, что понимать под синхронность протокола - это в данном случае передача бит в физическом носителе. Синхронизация передачи байтов (те самые DCE/DTR) протокол синхронным на физическом уровне не делают.

RVictor
()
Ответ на: комментарий от cruz7

> Но вот исходя и описания http://ru.wikipedia.org/wiki/RS485 синхробитs в RS485 не оговариваются, т.е. они могут быть, а могут и не быть, оставляется на усмотрение более верхних протоколов, получается так?

Да, там так и написано «EIA-485 only specifies the electrical signaling characteristics of a single balanced signal. Protocols and pin assignments are defined in other specifications.» Т.е., теоретически, ты можешь просто лампочку зажигать изменением состояния линий - пока электрически они удовлетворяют стандарту, он будет называться RS-485 (или EIA-485).

RVictor
()

Старт биты есть всегда. Стандартом определен один старт бит перед битами данных. Стоп битов может быть 1,1.5,2.

Если использовать «стандартные» АПИ «стандартных драйверов», то пользователь может менять только: кол-во бит данных, биты паритета, стоп-биты.

Чтобы сделать как нам вздумается - может быть понадобися переписать драйвер. Но в этом случае не факт что оно заработает, т.к. маса м/сх может не поддерживать эти режимы аппаратно.

ИМХО, вы что-то преувеличиваете с проблемой. Что за девайс? Что за протокол? Как вы можете писать приложение с «проприетарным» протоколом - если даже у вас нет описания этого протокола? Есть ли какие-то утилиты которые идут в комплекте с девайсом для чтения из него данных ? и т.п. больше инфы давайте.

kuzulis ★★
()
Ответ на: комментарий от RVictor

>он практически определяет асинхронность протокола

Наверное мы о разных понятиях говорим. Опишу

Асинхронный протокол - использует схему синхронизации байт как в COM порте PC. То есть 1 стартовый бит, стоповые биты ну и так далее.

Синхронный протокол - произвольная схема. То есть вместо одного стартового бита может быть например маркер из 11 бит. Вместо стопового бита может быть контрольная сумма из 16 бит и т.д.

http://sesia5.ru/lokseti/s232.htm

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Нет, последовательный синхронный протокол - это когда приёмник и передатчик используют отдельный сигнал синхронизации при передаче данных для каждого бита. В этом случае кроме сигнала данных есть сигнал синхронизации (clоck), генерируемый только одним устройством на линии. Данные выставляются/считываются на/с линии данных *синхронно* с линией clock.

Классическое описание: http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Когда же линия данных меняется без внешней синхронизации - это асинхронный протокол. Для синхронизации приёмника с передатчиком и приходится использовать элементы изменения линии данных - как старт бит в RS232 или преамбула в Ethernet (который асинхроннен на уровне физического носителя).

RVictor
()
Ответ на: комментарий от RVictor

Нет, последовательный синхронный протокол - это когда приёмник и передатчик используют отдельный сигнал синхронизации

http://www.denvo.ru/pub/hardware/rs-232.html

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

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

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

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Тут ещё пример.

http://fmi.asf.ru/Library/Book/Network/4_3.html

Читать начиная с

4.3.3 Типы модемов

В различных линиях передачи данных используются различные методы передачи: асинхронные и синхронные. Тип модема зависит от метода передачи и назначения сети.
pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Просто разная терминология. Я не отрицаю существование терминологии где «синхронный» значит имеющий внешнюю синхронизацию. Но достаточно часто понятия асинхронный/синхронный означает «стандартная схема старт-бит,стоп-бит,четность»/«нестандартная схема вычленения из битового потока массива байт (маркеры и т.п.)»

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Да, терминология может различаться, меняясь в зависимости от контекста.

Но всё-таки в железячном мире принято те протоколы, которые не имеют отдельной от данных синхронизации на уровне носителя (RS232, 1-Wire, Ethernet) называть асинхронными (хотя, формально, они включают механизмы синхронизации, некоторые - разрешения конфликтов и даже определение подключённых устройств). Даже модули для COM портов PC-шных соответственно называются UART (Universal Asynchronous Receiver Transmitter).

RVictor
()
Ответ на: комментарий от ansky

Не надо прикрывать словесным бредом незнание терминологии и предмета вообще.

Ну хорошо. Открой википедию и узри разницу между термином Asynchronous communication и Asynchronous serial communication

http://en.wikipedia.org/wiki/Asynchronous_communication

http://en.wikipedia.org/wiki/Asynchronous_serial_communication

Жаль только статью Synchronous_serial_communication не сделали. Ссылка красная. Было бы проще что-то доказывать.

Правда в статье про Asynchronous communication есть такой текст

The packets may be encapsulated in a data frame, with a frame synchronization bit sequence indicating the start of the frame, and sometimes also a bit synchronization bit sequence, typically 01010101, for identification of the bit transition times. Note that at the physical layer, this is considered as synchronous serial communication. Examples of packet mode data link protocols that can be/are transferred using synchronous serial communication are the HDLC, Ethernet, PPP and USB protocols.

Там помимо всего говорится прочего, что Ethernet использует synchronous serial communication. Надеюсь ты не будешь говорить, что у Ethernet внешняя синхронизация.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Знаешь, в 1980-х еще википедии не было, схемы, ты не поверишь, на кульмане рисовали. Все эти спецификации в подкорке сидят, не знаешь, как избавиться от них. Я пожалуй, что и сейчас на «Электронике-60» последовательный интерфейс (RS232 - говно, ИРПС рулит) в машинных кодах запрограммировал бы. (Tc-c! Не говорите ему, что там программа из нескольких байт.)

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

ansky ★★★★★
()
Ответ на: комментарий от ansky

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

В RS232 имеется некая структура посылки, т.е. определен, грубо говоря, некий формат посылки (кадра?). Можно ли это примерно назвать вторым уровнем в соответствии с моделью OSI/ISO или таки не дотягивает ?

cruz7 ★★
() автор топика
Ответ на: комментарий от ansky

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

Что нужно? Что не нужно? У меня такое ощущение, что высказанное может быть понято только вами и больше никем другим.

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

Я сам стараюсь поступать именно так.

Заметьте, что я не отвергаю то, что говорил RVictor. Недопонимание возникло именно из-за различиях в терминах. Я не знал, что словосочетание синхронная/асинхронная передача данных может иметь ещё какой-то другой смысл. Сейчас я согласен с тем, что все сказанное RVictor верно в рамках его терминологии, а так же то, что его терминология является достаточно распространенной и общепринятой.

Давай так, я дам вам ссылки, где (как я понимаю) говорится о понятиях синхронная/асинхронная передача данных именно в контексте моих представлений, не совпадающих с терминами RVictor. Если вы сможете доказать, что та синхронная передача является именно передачей с внешней синхронизацией и никак иначе, тогда я соглашусь, что действительно был не неправ. И тот грубый наезд («словесным бредом незнание терминологии и предмета вообще») полностью оправдан.

Ссылки:

http://sesia5.ru/lokseti/s225.htm

http://kom-seti.narod.ru/index.files/3.htm

pathfinder ★★★★
()
Ответ на: комментарий от cruz7

> В RS232 имеется некая структура посылки, т.е. определен, грубо говоря, некий формат посылки (кадра?). Можно ли это примерно назвать вторым уровнем в соответствии с моделью OSI/ISO или таки не дотягивает ?


Нет, по модели OSI RS232 - это физический уровень.

LamerOk ★★★★★
()
Ответ на: комментарий от pathfinder

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

Давайте лучше так: Я признаю Вашу правоту во всем, от начала до конца и прошу у Вас прощения за наезд.

Я изучил вики, гугль и лурк, но не понял что такое «cool down» применительно ко мне. Торможу наверное, ну мне можно.

ansky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.