этот последовательный порт Linux настроен так же, как Windows, один - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь перенести программу в linux, но не могу заставить работать последовательный порт.

это код windows

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]);
    }

а это мой код linux

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

всякий раз, когда я пытаюсь записать в последовательный порт, он возвращается с -1 и не дает мне никакой информации о том, что пошло не так. Я попытался с помощью errorno, и это сказал ошибка ввода / вывода, которая не помогает.

настроил ли я свой последовательный порт так же, как в исходной программе?

Может кто-нибудь дать совет, как отладить эту проблему, поскольку это не моя область знаний

1 Ответ

1 голос
/ 30 сентября 2011

Возможно, одна или несколько линий управления настроены неправильно. Пожалуйста, посмотрите tty_ioctl(4) раздел «Управление модемом» для TIOCMSET и связанных вещей. Ваш код Windows выглядит так, как будто он хочет установить DTR как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...