简体   繁体   中英

is this linux serial port configured the same as the windows one

I am trying to port a program to linux but i cannot get the serial port working.

this is the windows code

if( (idComDev[i] = CreateFile(ComStr,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0)) != INVALID_HANDLE_VALUE )
    {
        SetupComm(idComDev[i],1024,1024);
        cto.ReadIntervalTimeout = MAXDWORD;
        cto.ReadTotalTimeoutMultiplier = 0;
        cto.ReadTotalTimeoutConstant = 0;
        cto.WriteTotalTimeoutMultiplier = 0;
        cto.WriteTotalTimeoutConstant = 0;
        SetCommTimeouts(idComDev[i],&cto);
        sprintf(ComStr,"COM%hd:19,n,8,1",CommNo[i]);
        BuildCommDCB(ComStr,&dcb);
        dcb.fBinary = TRUE;
        dcb.BaudRate = baud;
        dcb.fOutxCtsFlow = FALSE;               // CTS output flow control
        dcb.fOutxDsrFlow = FALSE;               // DSR output flow control
        dcb.fDtrControl = DTR_CONTROL_ENABLE;   // DTR line on
        dcb.fDsrSensitivity = FALSE;            // DSR sensitivity
        dcb.fTXContinueOnXoff = FALSE;          // XOFF continues Tx
        dcb.fOutX = FALSE;                      // XON/XOFF out flow control
        dcb.fInX = FALSE;                       // XON/XOFF in flow control
        dcb.fErrorChar = FALSE;                 // enable error replacement
        dcb.fNull = FALSE;                      // enable null stripping
        dcb.fRtsControl = RTS_CONTROL_DISABLE;  // RTS flow control
        dcb.fAbortOnError = FALSE;              // abort reads/writes on error
        dcb.wReserved = 0;                      // Not used; must be set to zero
        dcb.ByteSize = 8;                       // number of bits/byte, 4-8

        dcb.StopBits = ONESTOPBIT;              // 0,1,2 = 1, 1.5, 2
                    dcb.Parity = SPACEPARITY; // use parity as address bit
        if( CardType == 2 ) SetCommMask(idComDev[i],EV_TXEMPTY);
        SetCommState(idComDev[i],&dcb);
        dbprintf("Seg %d = COM%hd\r\n",i,CommNo[i]);
    }

and this is my linux code

idComDev[i] = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (idComDev[i] == -1)
    {
    perror("open_port: Unable to open /dev/ttyS0 - ");
    ret = false;
    }
    else
    {
    fcntl(idComDev[i], F_SETFL, 0);

    struct termios options;

    tcgetattr(idComDev[i], &options); // get current settings

    cfsetispeed(&options, B115200); // set baud rate
    cfsetospeed(&options, B115200); // set baud rate
    options.c_cflag |= (CLOCAL | CREAD);

    options.c_cflag &= ~PARENB; // set parity to no 
    options.c_cflag &= ~CSTOPB;//set one stop bit
    options.c_cflag &= ~CSIZE; // Mask the character size bits 
    options.c_cflag |= CS8; // 8 bit data

    options.c_lflag |= (ICANON);
    options.c_iflag &= ~(IXON | IXOFF | IXANY); //disable software flow controll

    tcsetattr(idComDev[i], TCSANOW, &options);// save the settings

whenever i try to write to the serial port it returns with -1 and gives me no information as to what went wrong. i tried using errorno and that said input/output error which is not helpful.

have i configured my serial port in the same way as it is in the original program ?

can anyone give advice on how to debug this problem as this is not my area of expertise

Perhaps one or more of the control lines are not set properly. Please look at tty_ioctl(4) section "Modem Control" for TIOCMSET and associated stuff. Your Windows code looks like it want to set DTR at least.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM