int WriteComPort (int fd, char * data, int datalength) { fd_set fs_write; struct timeval tv_timeout; int retval, len, total_len; FD_ZERO (&fs_write); FD_SET (fd, &fs_write); tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ()); tv_timeout.tv_usec = TIMEOUT_USEC; for (total_len = 0, len = 0; total_len < datalength;) { retval = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout); if (retval) { len = write (fd, &data[total_len], datalength - total_len); if (len > 0) total_len += len; } else { tcflush (fd, TCOFLUSH); /* flush all output data */ break; } } return (total_len); }
void Midi::Print(void) { const _midi_direction dir = GetDirection(); const uint32_t nBaudrate = GetBaudrate(); const uint8_t nChannel = GetChannel(); printf("MIDI configuration:\n"); printf(" Direction : %s\n", dir == MIDI_DIRECTION_INPUT ? "Input" : "Output"); if (dir == MIDI_DIRECTION_INPUT) { printf(" Channel : %d %d\n", nChannel, nChannel == 0 ? "(OMNI mode)" : ""); } printf(" Active sense : %s\n", GetActiveSense() ? "Enabled" : "Disabled"); printf(" Baudrate : %d %s\n", (int) nBaudrate, nBaudrate == MIDI_BAUDRATE_DEFAULT ? "(Default)" : ""); printf(" Interface : %s\n", GetInterfaceDescription()); }
int WriteComPort (int fd, unsigned char *data, int datalength) { int retval, len = 0, total_len = 0; int i; FD_ZERO (&fs_write); FD_SET (fd, &fs_write); tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ()); tv_timeout.tv_usec = TIMEOUT_USEC; for (total_len = 0, len = 0; total_len < datalength;) { retval = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout); if (retval) { len = write (fd, data+total_len, datalength - total_len); if (len > 0) { total_len += len; } } else if(retval == 0) { printf("WriteComPort timeout \n"); break ; } else { printf("select return error %d\n",retval); //tcflush (fd, TCOFLUSH); /* flush all output data */ break; } } tcdrain(fd); //usleep(500); #if 0 printf("write: "); for(i=0;i<total_len; i++) printf("0x%02x ",data[i]); printf("(total_len = %d)\r\n",total_len); #endif if(total_len != datalength) { printf("WriteComPort error \n"); return -1; } else return 0; }
int ReadComPort (int fd, void *data, int datalength) { fd_set fs_read; struct timeval tv_timeout; int retval = 0; FD_ZERO (&fs_read); FD_SET (fd, &fs_read); tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ()); tv_timeout.tv_usec = TIMEOUT_USEC; retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout); if (retval) return (read (fd, data, datalength)); else return (-1); }
bool CLinuxSerialPort::Open(const std::string &Name, int Baudrate, int /*Parity*/) { int Flags = O_RDWR | O_NOCTTY | O_SYNC; m_FileDescriptor = open(Name.c_str(), Flags); if(0<=m_FileDescriptor) { // remember current properties, so we can restore upon close std::memset(&m_PrevProperties, 0, sizeof(m_PrevProperties)); if(tcgetattr (m_FileDescriptor, &m_PrevProperties) != 0) { perror("error %d from tcgetattr"); return false; } // setting properties of the serial port struct termios Termios; memset(&Termios, 0, sizeof(Termios)); Termios.c_cflag = GetBaudrate(Baudrate) | CS8 | CLOCAL | CREAD; Termios.c_iflag = IGNPAR; Termios.c_oflag = 0; Termios.c_lflag = 0; // set input mode (non-canonical, no echo,...) // parity is ignored => no parity Termios.c_cc[VTIME] = 1;//0.1 sec timeout Termios.c_cc[VMIN] = 0;// 0 => no blocking, 1 => block untill at least 1 is read if(tcflush(m_FileDescriptor, TCIFLUSH) <0) { perror("error %d from tcsetattr"); return false; } if (tcsetattr (m_FileDescriptor, TCSANOW, &Termios) < 0) { perror("error %d from tcsetattr"); return false; } } return IsOpen(); }