Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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());
}
Ejemplo n.º 3
0
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;
 }
Ejemplo n.º 4
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();
}