bool raw_serial::open(const char * portname, _u32 baudrate, _u32 flags) { if (isOpened()) close(); _serial_handle = CreateFile( portname, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL ); if (_serial_handle == INVALID_HANDLE_VALUE) return false; if (!SetupComm(_serial_handle, SERIAL_RX_BUFFER_SIZE, SERIAL_TX_BUFFER_SIZE)) { close(); return false; } _dcb.BaudRate = baudrate; _dcb.ByteSize = 8; _dcb.Parity = NOPARITY; _dcb.StopBits = ONESTOPBIT; _dcb.fDtrControl = DTR_CONTROL_ENABLE; if (!SetCommState(_serial_handle, &_dcb)) { close(); return false; } if (!SetCommTimeouts(_serial_handle, &_co)) { close(); return false; } if (!SetCommMask(_serial_handle, EV_RXCHAR | EV_ERR )) { close(); return false; } if (!PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR )) { close(); return false; } Sleep(30); _is_serial_opened = true; //Clear the DTR bit set DTR=high clearDTR(); return true; }
void plugin_close_rig( void ) { if( port ) { clearDTR( port ); close(port); } port = 0; #ifdef DEBUG fprintf(stderr,"ICR10: close rig succeed.\n"); #endif }
bool raw_serial::open(const char * portname, uint32_t baudrate, uint32_t flags) { if (isOpened()) close(); serial_fd = ::open(portname, O_RDWR | O_NOCTTY | O_NDELAY); if (serial_fd == -1) return false; struct termios options, oldopt; tcgetattr(serial_fd, &oldopt); bzero(&options,sizeof(struct termios)); _u32 termbaud = getTermBaudBitmap(baudrate); if (termbaud == (_u32)-1) { close(); return false; } cfsetispeed(&options, termbaud); cfsetospeed(&options, termbaud); // enable rx and tx options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; //no checkbit options.c_cflag &= ~CSTOPB; //1bit stop bit options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; /* Select 8 data bits */ #ifdef CNEW_RTSCTS options.c_cflag &= ~CNEW_RTSCTS; // no hw flow control #endif options.c_iflag &= ~(IXON | IXOFF | IXANY); // no sw flow control // raw input mode options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // raw output mode options.c_oflag &= ~OPOST; tcflush(serial_fd,TCIFLUSH); /* if (fcntl(serial_fd, F_SETFL, FNDELAY)) { close(); return false; } */ if (tcsetattr(serial_fd, TCSANOW, &options)) { close(); return false; } _is_serial_opened = true; //Clear the DTR bit to let the motor spin clearDTR(); return true; }