Можно ли использовать 9-битную последовательную связь в Linux? - PullRequest
11 голосов
/ 30 июня 2010

Для связи RS-232 иногда используются 9-битные байты.Это может использоваться для связи с несколькими микроконтроллерами на шине, где 8 битов являются данными, а дополнительный бит указывает байт адреса (а не данные).Неактивные контроллеры генерируют прерывание только для байтов адреса.

Может ли программа Linux отправлять и получать 9-битные байты через последовательное устройство?Как?

Ответы [ 6 ]

5 голосов
/ 30 июня 2010

Система termios напрямую не поддерживает 9-битную операцию, но в некоторых системах ее можно эмулировать, выполняя трюки с флагом CMSPAR.Он не документирован, и он не появляется во всех реализациях.

Вот ссылка на подробное описание того, как выполняется 9-битная эмуляция:

http://www.lothosoft.ch/thomas/libmip/markspaceparity.php

3 голосов
/ 19 января 2013

9-битные данные являются стандартной частью RS-485 и используются в многоточечных приложениях. Аппаратное обеспечение на базе устройств 16C950 может поддерживать 9-бит, но только если UART используется в режиме 950 (а не в более распространенных режимах 450/550 для RS-232).

Описание 16C950 можно найти здесь .

На этой странице приводится сводная информация о поддержке Linux RS-485, которая встроена в более новые ядра (> = 3,2 rc3).

2 голосов
/ 04 марта 2016

В основном он хочет вывести данные из Linux-коробки, а затем отправить их, скажем, по 2-х проводной шине с кучей макс. 322 микросхем -> некоторый микроконтроллер с реализацией UART или программного обеспечения RS232

можноне используйте отдельные преобразователи уровня max232, пока не возникнут проблемы с напряжением между отдельными микроконтроллерами (например, на одной печатной плате, а не в разных зданиях;) вплоть до максимальной выходной (ttl) нагрузки max232 (иликлоны, или резистор и инвертор / транзистор) ic.

не может найти настройки linux termios для контроля четности MARK или SPACE (что, я уверен, аппаратные uarts на самом деле поддерживают, но не реализацию linux tty),поэтому мы просто будем хакать бит фактической генерации четности.

8 битов данных, 2 стоповых бита имеют ту же длину, что и 8 бит данных, 1 бит четности, 1 стоповый бит.(где первый стоп-бит представляет собой логическую единицу 1, отрицательное линейное напряжение).

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

это обеспечивает 8-битный прозрачный, хотя односторонний трафик, означает обращение к «многим вещам» (256 разных (групп) вещей, на самом деле;) на одной шине.это один из способов, потому что, когда кто-то захочет сделать 2 пути, вам понадобятся две пары проводов, или модулирование на нескольких частотах, или реализация обнаружения коллизий и всего этого.

Микроконтроллеры PIC могут делать 9бит последовательной связи с ehm «какая-то хитрость» (9-й бит на самом деле находится в другом регистре;)

сейчас ... учитывая тот факт, что в Linux и тому подобном это не так, что это просто ...

рассматривали ли вы просто включение четности для «адресного слова» (в котором вам нужно 9 бит;), а затем либо установить его в нечетное или четное значение, рассчитать его так, чтобы было выбрано правильное9-й (четность) бит «1» при включенной четности и 8-битный «данные», затем снова выключите четность и включите 2 стоповых бита.(который по-прежнему сохраняет длину 9-битного слова в том, что касается вашего микроконтроллера;) ... это давно, но насколько я помню, стоп-биты так же длинны, как биты данных во времени.

это должно работать на всем, что может делать 8-битный вывод, с четностью и с 2 стоп-битами.который включает в себя компьютерное оборудование и Linux.(и все, что нужно)

Аппаратное обеспечение ПК также имеет возможность просто включить или отключить «четность» для всех слов (без фактического вычисления), если я правильно помню из «назад в дни»

Более того, 9-й бит, о котором говорится в таблице данных pic, на самом деле является битом четности, как в спецификациях RS-232.просто вы можете выключить или включить его.(в любом случае на PIC - в linux это немного сложнее)

(ничего, что некоторые настройки termios в linux не решат, я думаю ... просто включите и выключите их тогда ... мыМы заставили эти вещи делать более странные вещи;)

Микроконтроллер рис на самом деле делает то же самое, только то, что он не представлен как «что это на самом деле» в таблице данных.на самом деле они называют это «9-й бит» и тому подобное.на компьютерах и, следовательно, на Linux, он работает примерно так же, как и все.

в любом случае, если эта вещь должна работать «в обе стороны», то удачи, соединяя ее с 2 парами или придумывая какой-то способ обнаружения коллизий, которыйэто чертовски проблематично, чем получить 9 битов.

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

   #include<termios.h>
   #include<stdio.h>
   #include<sys/types.h>
   #include<sys/stat.h>
   #include<fcntl.h>
   #include<unistd.h>
   #include<stdint.h>
   #include<string.h>
   #include<stdlib.h>

   struct termios com1pr;
   int com1fd;

   void bit9oneven(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9even

   void bit9onodd(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB|PARODD;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9odd

   void bit9off(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|CSTOPB;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9off

   void initrs232(){
   com1fd=open("/dev/ttyUSB0",O_RDWR|O_SYNC|O_NOCTTY);
   if(com1fd>=0){
   tcflush(com1fd,TCIOFLUSH);
   }else{printf("FAILED TO INITIALIZE\n");exit(1);};
   };//initrs232

   void sendaddress(unsigned char x){
   unsigned char n;
   unsigned char t=0;
   for(n=0;n<8;n++)if(x&2^n)t++;
   if(t&1)bit9oneven(com1fd);
   if(!(t&1))bit9onodd(com1fd);
   write(com1fd,&x,1);
   };

   void main(){

   unsigned char datatosend=0x00; //bogus data byte to send
   initrs232();
   while(1){
   bit9oneven(com1fd);
   while(1)write(com1fd,&datatosend,1);
   //sendaddress(223); // address microcontroller at address 223;
   //write(com1fd,&datatosend,1); // send an a
   //sendaddress(128); // address microcontroller at address 128;
   //write(com1fd,&datatosend,1); //send an a
   }
   //close(com1fd);
   };

что-то работает .. может быть, что-то не так, но отправляет 9 бит. (CSTOPB устанавливает 2 стоп-бита, что означает, что для 8-битных транспарантных данных 9-й бит = 1, в режиме адресации 9-й бит = 0;)

также обратите внимание, что фактические уровни напряжения линии RS232 отличаются от того, что «читает» ваша программа (что аналогично «инвертированным» уровням 5 В ttl, которые ваш микроконтроллер получает от транзистора или инвертора или клона max232 IC). (-19 В или -10 В (шт.) Для логической 1, + 19 / + 10 для логической 0), стоповые биты имеют отрицательное напряжение, например, 1, и имеют одинаковую длину.

биты выходят из 0-7 (и в этом случае: 8;) ... поэтому стартовый бит -> 0, 1,2,3,4,5,6,7,

это немного хакерски, но, похоже, работает на прицеле. enter image description here

2 голосов
/ 30 ноября 2014

9-битное кадрирование данных возможно, даже если в реальном мире UART нет. Нашел одну библиотеку, которая также делает это под Windows и Linux. Смотри http://adontec.com/9-bit-serial-communication.htm

1 голос
/ 30 июня 2010

Может ли программа Linux отправлять и получать 9-битные байты через последовательное устройство?

Стандартное оборудование UART (8251 и т. Д.) Не поддерживает режимы 9-битных данных.

0 голосов
/ 30 октября 2016

Я также сделал полную демонстрацию для 9-битной эмуляции UART (на основе четного / нечетного контроля четности).Вы можете найти его здесь .

Все источники доступны на git .

.Надеюсь, вам понравится.

...