Serielle Schnittstelle



  • Hallo zusammen,

    ich sende von einem Linuxsystem verschiedene Charaktere über RS232 zu einem WinPC. Nun habe ich das Problem das es manche Charaktere nicht richtig überträgt.

    Nach langer Sucherei habe ich dann aus Verzweiflung ein anderes Kabel(welches nur die Leitungen TX,RX und GND hat) angeschlossen und siehe da es funktioniert einwandfrei.

    Nun denke ich das ich bei den c_iflag, c_oflag, c_cflag, c_lflag noch etwas vergessen habe.

    Hat jemand eine Ahnung was ich da noch unbedingt ausschalten muss?

    Vielen Dank im voraus

    Meine Flags: (Konfig alles ausgeschaltet, 1 Stopbit)

    Lr_termInfo.c_iflag     = IGNPAR; // Input  mode flags.
                  Lr_termInfo.c_oflag     = 0;      // Output mode flags.
                  Lr_termInfo.c_lflag     = 0;      // Local  mode flags.
                  Lr_termInfo.c_cc[VMIN]  = 1;      
                  Lr_termInfo.c_cc[VTIME] = 0;      // No time stamp expected.
    
                  // Control mode flags:
                  // CREAD: Reading will be used.
                  // CLOCAL: Without modem.
    		Lr_termInfo.c_cflag = Ae_baudRate | Ae_dataBits | Ae_parity | CREAD | CLOCAL;
    


  • //*****************************************************************************
    //*
    //*     ComOpen
    //*
    //*****************************************************************************
    //  Öffnet eine serielle Verbindung
    //  uNr         : Ist die Nummer des Com-Ports (0=COM1 1=COM2 ...)
    //  iBaud       : Ist die Bautrate
    //  iParity     : 0 = kein iParity Bit  (PARITY__NONE)
    //                1 = ungerade          (PARITY__ODD)
    //                2 = gerade            (PARITY__EVEN)
    //                3 = immer 0           (PARITY__ZERO)
    //                4 = immer 1           (PARITY__ONE)
    //  iStopbits   : 0 = Ein Stopbit       (STOPBITS_ONE)
    //                1 = Zwei iStopbits    (STOPBITS_TWO)
    //  iBits       : 0 = 8 Datenbits
    //                1 = 7 Datenbits
    //                7 = 7 Datenbits       (DATABITS_SEVEN)
    //                8 = 8 Datenbits       (DATABITS_EIGHT)
    //  iFlags      : Some Flags
    //                2 = DTR_HANDSHAKE : Switsches on the DTR handshake
    //                4 = RTS_HANDSHAKE : Switsches on the RDS handshake
    //  Ergibt ein Handel wenn eine Schnittstelle geöffnet wurde sonst -1
    int ComOpen(unsigned uNr,int iBaud,int iParity,int iStopbits,int iDatabits,int iFlags)
    {
    struct      serial_struct sData;
    struct      termios sPortInfo;
    char        cName[]="/dev/ttyS0";
    int         iHandle,i,iBitsPerByte,iBaudNr;
    
        if(uNr>=MAX_COM_PORTS)return 0;
    
        cName[0]+=uNr;
        iHandle=open(cName,O_RDWR|O_NONBLOCK|O_NOCTTY);     // Device oeffnen
    
        if(iHandle<0)return 0;
    
        tcgetattr(iHandle, &sPortInfo);
        cfmakeraw(&sPortInfo);
        sPortInfo.c_cc[VMIN] = 0;
        sPortInfo.c_cc[VTIME]= 0;
    
        if(iStopbits!=STOPBITS_ONE)                         // Stopbits einstellen
                sPortInfo.c_cflag |=  CSTOPB;
        else    sPortInfo.c_cflag &= ~CSTOPB;
    
        sPortInfo.c_cflag &= ~CSIZE;                        // Datenbits einstellen
        sPortInfo.c_cflag |= (iDatabits&1)? CS7:CS8;
    
        switch(iParity)                                     // Parity-Bits einstellen
            {
        case PARITY__NONE:  sPortInfo.c_cflag =  sPortInfo.c_cflag & ~PARENB;               break;
        case PARITY__ODD :  sPortInfo.c_cflag =  sPortInfo.c_cflag |  PARENB  |  PARODD;    break;
        case PARITY__EVEN:  sPortInfo.c_cflag = (sPortInfo.c_cflag |  PARENB) & ~PARODD;    break;
        default:            close(iHandle);
                            return -1;
            }
    
        tcsetattr(iHandle,TCSANOW,&sPortInfo);
    
        for(i=0;i<MAX_SPEED;i++)
            {
            if(aTcSpeeds[i].iBaud==iBaud)break;
            }
    
        if(i>=MAX_SPEED)
            {
            errno=-EFAULT;
            close(iHandle);
            return -1;
            }
    
        ioctl(iHandle,TIOCGSERIAL,&sData);                  // Spezial-Baudraten löschen
        sData.flags &= ~ASYNC_SPD_MASK;
        ioctl(iHandle,TIOCSSERIAL,&sData);
    
        iBaudNr=aTcSpeeds[i].iCode;
        tcgetattr(iHandle,&sPortInfo);
        cfsetospeed(&sPortInfo, iBaudNr);
        cfsetispeed(&sPortInfo, iBaudNr);
        tcsetattr(iHandle,TCSANOW,&sPortInfo);
    
        i  = (iFlags&RTS_ON)? 0:TIOCM_RTS;                  // RTS DTR ausschalten
        i |= (iFlags&DTR_ON)? 0:TIOCM_DTR;
    
        ioctl(iHandle, TIOCMBIC,&i);
    
        i  = (iFlags&RTS_ON)? TIOCM_RTS:0;                  // RTS DTR einschalten
        i |= (iFlags&DTR_ON)? TIOCM_DTR:0;
    
        ioctl(iHandle, TIOCMBIS,&i);
    
                       iBitsPerByte=10;                     // calculate time for one byte
        if(iDatabits&1)iBitsPerByte--;
        if(iStopbits  )iBitsPerByte++;
        if(iParity!=0 )iBitsPerByte++;
    
        iUsPerByte[uNr]=(1000*1024*iBitsPerByte)/iBaud;
        hComFile  [uNr]=iHandle;
        bIsOpen   [uNr]=1;
    
    return iHandle;
    }
    

Anmelden zum Antworten