В основном он хочет вывести данные из 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,
это немного хакерски, но, похоже, работает на прицеле.