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