Взаимодействие RS-232 иногда использует 9-битные байты. Это можно использовать для связи с несколькими микроконтроллерами на шине, где 8 бит - это данные, а дополнительный бит указывает адресный байт (а не данные). Неактивные контроллеры генерируют только прерывание для байтов адреса.
Может ли программа Linux отправлять и получать 9-битные байты по последовательному устройству? Как?
Ответ 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,
он немного взломан, но, похоже, работает над областью.
![введите описание изображения здесь]()