代码之家  ›  专栏  ›  技术社区  ›  joeforker

在Linux中可以使用9位串行通信吗?

  •  11
  • joeforker  · 技术社区  · 14 年前

    RS-232通信有时使用9位字节。这可用于与总线上的多个微控制器通信,其中8位是数据,额外的位表示地址字节(而不是数据)。非活动控制器只生成地址字节的中断。

    6 回复  |  直到 13 年前
        1
  •  5
  •   Amardeep AC9MF    14 年前

    TymiOS系统不直接支持9位操作,但它可以通过使用CMSPAR标记来欺骗某些系统。它没有文档记录,而且我的代码也没有出现在所有的实现中。

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

        2
  •  3
  •   Peter Krnjevic    12 年前

    9位数据是RS-485的标准部分,用于多点应用。基于16C950设备的硬件 可以

    可以找到16C950的说明 here .

    This

        3
  •  3
  •   LinuxGuy001    10 年前

    即使现实世界的UARTs没有9位数据帧也是可能的。 找到了一个在Windows和Linux下也可以使用的库。 见 http://adontec.com/9-bit-serial-communication.htm

        4
  •  2
  •   HRH Sven Olaf of CyberBunker    8 年前

    一个人可以离开个人的MAX22电平转换器,只要在单个微控制器(在同一PCB上,而不是在不同的建筑物中)之间没有电压效力问题,直到最大输出(TTL)负载的MAX23 2(或克隆,或电阻器和逆变器/晶体管)IC。

    找不到标记或空间奇偶校验的linux termios设置(我相信硬件uart确实支持,只是不支持linux tty实现),所以我们只需稍微修改一下实际的奇偶校验生成。

    8个数据位,2个停止位与8个数据位长度相同,1个奇偶校验位,1个停止位。(其中第一个停止位是逻辑1,负线电压)。

    这就提供了一个8位transparant,虽然是单向通信,但意味着要在同一总线上处理“很多事情”(实际上是256个不同的(组)事情)。这是一种方法,因为当一个人想做两种方法时,你需要两个线对,或者在多个频率下进行调制,或者实现共线检测,等等。

    PIC微控制器可以用ehm的“一些诡计”进行9位串行通信(第9位实际上在另一个寄存器中;)

    您是否考虑过简单地为“地址字”(其中需要9位;)打开奇偶校验,然后将其设置为奇数或偶数,计算它,以便选择正确的地址字使奇偶校验打开的第9位(奇偶校验)为“1”,8位为“数据”,然后关闭奇偶校验并打开2个停止位。(就微控制器而言,它仍然保持9位字的长度;)。。。这是很久以前的事了,但据我记忆,停止位和数据位在时间上一样长。

    这应该适用于任何可以进行8位输出、奇偶校验和2个停止位的情况。其中包括pc硬件和linux。(和dos等)

    如果我能正确地回忆起“过去的日子”,pc硬件也可以选择打开或关闭所有单词的“奇偶校验”(不需要实际计算)

    (没有什么是linux上的一些termios设置不能解决的,我想。。。打开然后关上。。。我们让那些东西做了更奇怪的事情;)

    一个pic微控制器实际上也做了同样的事情,只是它没有像数据表中的“它实际是什么”那样显示出来。他们称之为“第9位”之类的。在pc机上,因此在linux上,它的工作方式与之基本相同。

    不管怎样,如果这件事应该“双向”工作,那么祝你好运,用2对线连接它,或者想出一些方法来进行碰撞检测,这比取出9个比特要麻烦得多。

       #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线电压水平与软件“读取”的电压水平相反(这与pic微控制器从晶体管或逆变器或max232克隆ic获得的“反向”5v ttl水平相同)。逻辑1为-19v或-10v(pc),逻辑0为+19/+10,停止位为负电压,如1,长度相同。

    位输出0-7(在本例中为8;)。。。所以起始位->0、1、2、3、4、5、6、7,

    这有点老套,但似乎在示波器上起作用。 enter image description here

        5
  •  1
  •   ChrisW    14 年前

    Linux程序可以通过串行设备发送和接收9位字节吗?

        6
  •  0
  •   Arnab Nandy    8 年前

    我还制作了9位UART仿真的完整演示(基于奇偶校验)。你可以找到它 here

    上的所有可用源 git .