AREXPORT int ArSerialConnection::internalOpen(void) { struct termios tio; if (myStatus == STATUS_OPEN) { ArLog::log(ArLog::Terse, "ArSerialConnection::internalOpen: Serial port already open"); return OPEN_ALREADY_OPEN; } if (myIs422) ArLog::log(ArLog::Verbose, "ArSerialConnection::internalOpen: Connecting to serial422 port '%s'", myPortName.c_str()); else ArLog::log(ArLog::Verbose, "ArSerialConnection::internalOpen: Connecting to serial port '%s'", myPortName.c_str()); /* open the port */ if (!myIs422) { if ((myPort = ArUtil::open(myPortName.c_str(),O_RDWR | O_NDELAY)) < 0) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Could not open serial port '%s'", myPortName.c_str()); return OPEN_COULD_NOT_OPEN_PORT; } } else { // PS 9/9/11 - the RDONLY worked for the s3series as it did not // do any writes, but the sZseries needs to do writes, so changed the // flag to RDWR // if ((myPort = ArUtil::open(myPortName.c_str(),O_RDONLY | O_NOCTTY)) < 0) if ((myPort = ArUtil::open(myPortName.c_str(),O_RDWR | O_NOCTTY)) < 0) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Could not open serial port '%s'", myPortName.c_str()); return OPEN_COULD_NOT_OPEN_PORT; } } /* set the tty baud, buffering and modes */ if (tcgetattr(myPort, &tio) != 0) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Could not get port data to set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } /* turn off echo, canonical mode, extended processing, signals */ tio.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); /* turn off break sig, cr->nl, parity off, 8 bit strip, flow control */ tio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); /* clear size, turn off parity bit */ tio.c_cflag &= ~(CSIZE | PARENB); /* set size to 8 bits */ tio.c_cflag |= CS8; /* turn output processing off */ tio.c_oflag &= ~(OPOST); /* Set time and bytes to read at once */ tio.c_cc[VTIME] = 0; tio.c_cc[VMIN] = 0; // PS 7/3/11 - check if dev is RS422, if so then the cflags need // to be set different, for now test for dev/ttyS3, later we need to input that // the device is RS422 // PS 9/9/11 - taking out the B38500, we now set the baud below if (myIs422) tio.c_cflag = CS8 | CLOCAL | CREAD |IGNPAR; //tio.c_cflag = B57600 | CS8 | CLOCAL | CREAD |IGNPAR; if (tcflush(myPort,TCIFLUSH) == -1) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Could not set up port tcflush failed"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } if (tcsetattr(myPort,TCSAFLUSH,&tio) == -1) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Could not set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } myStatus = STATUS_OPEN; // PS 7/3/11 - only set the baud and hw control if RS232 // for now test for dev/ttyS3, later we need to input that // the device is RS422 if (!myIs422) { if (myBaudRate != 0 && rateToBaud(myBaudRate) == -1) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Invalid baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_INVALID_BAUD_RATE; } //printf("my baud rate = %d\n",myBaudRate); if (myBaudRate != 0 && !setBaud(myBaudRate)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_BAUD; } if (!setHardwareControl(myHardwareControl)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set hardware control."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } } // PS 9/9/11 - added else for SZ else { if (myBaudRate != 0 && rateToBaud(myBaudRate) == -1) { ArLog::logErrorFromOS(ArLog::Terse, "ArSerialConnection::open: Invalid baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_INVALID_BAUD_RATE; } //printf("my baud rate = %d\n",myBaudRate); if (myBaudRate != 0 && !setBaud(myBaudRate)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_BAUD; } } ArLog::log(ArLog::Verbose, "ArSerialConnection::open: Successfully opened and configured serial port '%s'.", myPortName.c_str()); return 0; }
AREXPORT int ArSerialConnection::internalOpen(void) { struct termios tio; if (myStatus == STATUS_OPEN) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Serial port already open"); return OPEN_ALREADY_OPEN; } /* open the port */ if ((myPort = ::open(myPortName.c_str(),O_RDWR | O_NDELAY)) < 0) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not open serial port '%s'", myPortName.c_str()); return OPEN_COULD_NOT_OPEN_PORT; } /* set the tty baud, buffering and modes */ if (tcgetattr(myPort, &tio) != 0) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not get port data to set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } /* turn off echo, canonical mode, extended processing, signals */ tio.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); /* turn off break sig, cr->nl, parity off, 8 bit strip, flow control */ tio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); /* clear size, turn off parity bit */ tio.c_cflag &= ~(CSIZE | PARENB); /* set size to 8 bits */ tio.c_cflag |= CS8; /* turn output processing off */ tio.c_oflag &= ~(OPOST); /* Set time and bytes to read at once */ tio.c_cc[VTIME] = 0; tio.c_cc[VMIN] = 0; if (tcsetattr(myPort,TCSAFLUSH,&tio) < 0) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } myStatus = STATUS_OPEN; if (rateToBaud(myBaudRate) == -1) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Invalid baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_INVALID_BAUD_RATE; } if (!setBaud(myBaudRate)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_BAUD; } if (!setHardwareControl(myHardwareControl)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set hardware control."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } ArLog::log(ArLog::Verbose, "ArSerialConnection::open: Successfully opened and configured serial port."); return 0; }
AREXPORT int ArSerialConnection::internalOpen(void) { DCB dcb; if (myStatus == STATUS_OPEN) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Serial port already open"); return OPEN_ALREADY_OPEN; } myPort = CreateFileA(myPortName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, /* exclusive access */ NULL, /* no security attrs */ OPEN_EXISTING, 0, NULL ); if (myPort == INVALID_HANDLE_VALUE) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not open serial port '%s'", myPortName.c_str()); return OPEN_COULD_NOT_OPEN_PORT; } if ( !GetCommState(myPort, &dcb) ) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not get port data to set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = 0; dcb.fBinary = TRUE; dcb.fParity = FALSE; dcb.fNull = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; if ( !SetCommState(myPort, &dcb) ) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set up port"); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } myStatus = STATUS_OPEN; if (!setBaud(myBaudRate)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set baud rate."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_BAUD; } if (!setHardwareControl(myHardwareControl)) { ArLog::log(ArLog::Terse, "ArSerialConnection::open: Could not set hardware control."); close(); myStatus = STATUS_OPEN_FAILED; return OPEN_COULD_NOT_SET_UP_PORT; } ArLog::log(ArLog::Verbose, "ArSerialConnection::open: Successfully opened and configured serial port."); return 0; }