Можно ли использовать 9-битную последовательную связь в Linux?

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Эта страница представляет собой поддержку Linux RS-485, которая запекается в более свежие ядра ( >= 3.2 rc3).

Ответ 3

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

Ответ 4

в основном то, что он хочет, это выводить данные из окна Linux, а затем отправлять его на двухпроводной шине с кучей max232 ic → некоторый микроконтроллер с реализацией uart или программного обеспечения rs232

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

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

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

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

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

Микроконтроллеры PIC могут выполнять 9-битную последовательную связь с ehm 'some trickery' (9-й бит фактически находится в другом регистре;)

теперь... учитывая тот факт, что на linux и подобных ему нет - просто...

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

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

Аппаратное обеспечение

pc также имеет опции, позволяющие включать или выключать "четность" для всех слов (без фактического вычисления), если я правильно вернусь из "назад в дни"

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

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

pic-микроконтроллер фактически делает то же самое, только что он не представлен как "что это на самом деле" в таблице данных. они на самом деле называют это "девятым битом" и тому подобное. на ПК и, следовательно, на linux он работает почти так же, как и т.д.

в любом случае, если эта вещь должна работать "в обоих направлениях", а затем удача проводки ее двумя парами или выяснение какого-то способа обнаружения коллизий, что намного сложнее, чем получение 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 - это наоборот, от того, что читает ваше программное обеспечение (это то же самое, что "инвертированные" уровни 5v ttl, которые ваш микроконтроллер pic получает от транзистора или инвертора или клона max232 IC). (-19v или -10v (pc) для логики 1, + 19/+ 10 для логики 0), стоповые биты представляют собой отрицательное напряжение, как 1, и одну и ту же длину.

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

он немного взломан, но, похоже, работает над областью. введите описание изображения здесь

Ответ 5

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

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

Ответ 6

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

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

Вы можете легко адаптировать его для своего устройства. Надеюсь, вам понравится.