void zgb_terminate(void) { zgb_hal_close(); }
int zgb_hal_open( int devIndex, float baudrate , int* fd) { // Opening device // devIndex: Device index // baudrate: Real baudrate (ex> 115200, 57600, 38400...) // Return: 0(Failed), 1(Succeed) struct termios newtio; struct serial_struct serinfo; char dev_name[100] = {0, }; sprintf(dev_name, "/dev/ttyUSB%d", devIndex); strcpy(gDeviceName, dev_name); memset(&newtio, 0, sizeof(newtio)); zgb_hal_close(); if((gSocket_fd = open(gDeviceName, O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0) { fprintf(stderr, "device open error: %s\n", dev_name); goto ZGB_HAL_OPEN_ERROR; } newtio.c_cflag = B38400|CS8|CLOCAL|CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; // time-out 값 (TIME * 0.1초) 0 : disable newtio.c_cc[VMIN] = 0; // MIN 은 read 가 return 되기 위한 최소 문자 개수 tcflush(gSocket_fd, TCIFLUSH); tcsetattr(gSocket_fd, TCSANOW, &newtio); if(gSocket_fd == -1) return 0; if(ioctl(gSocket_fd, TIOCGSERIAL, &serinfo) < 0) { fprintf(stderr, "Cannot get serial info\n"); return 0; } serinfo.flags &= ~ASYNC_SPD_MASK; serinfo.flags |= ASYNC_SPD_CUST; serinfo.custom_divisor = serinfo.baud_base / baudrate; if(ioctl(gSocket_fd, TIOCSSERIAL, &serinfo) < 0) { fprintf(stderr, "Cannot set serial info\n"); return 0; } zgb_hal_close(); gfByteTransTime = (float)((1000.0f / baudrate) * 12.0f); strcpy(gDeviceName, dev_name); memset(&newtio, 0, sizeof(newtio)); zgb_hal_close(); if((gSocket_fd = open(gDeviceName, O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0) { fprintf(stderr, "device open error: %s\n", dev_name); goto ZGB_HAL_OPEN_ERROR; } newtio.c_cflag = B38400|CS8|CLOCAL|CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; // time-out 값 (TIME * 0.1초) 0 : disable newtio.c_cc[VMIN] = 0; // MIN 은 read 가 return 되기 위한 최소 문자 개수 tcflush(gSocket_fd, TCIFLUSH); tcsetattr(gSocket_fd, TCSANOW, &newtio); *fd = gSocket_fd; return 1; ZGB_HAL_OPEN_ERROR: zgb_hal_close(); return 0; }