#include #include #include #include #include static int exitRequested = 0; static void sigintHandler(int signum) { fprintf(stderr, "Shutdown requested\n"); exitRequested = 1; } int main(int argc, char **argv) { int f = 0, i = 0, tmp = 0; unsigned short status = 0; struct ftdi_context *ftdi; unsigned char buff[513]; int VID = 0x0403; int PID = 0x6001; if ((ftdi = ftdi_new()) == 0) { fprintf(stderr, "ftdi_new failed\n"); return EXIT_FAILURE; } fprintf(stdout, "Opening...\n"); if(ftdi_usb_open_desc(ftdi, VID, PID, "USB Serial Converter", "MYSERIALNUMBER") < 0) { fprintf(stderr, " ftdi_usb_open failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Reset...\n"); if(ftdi_usb_reset(ftdi) < 0) { fprintf(stderr, " ftdi_usb_reset failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Setting Line Properties...\n"); if(ftdi_set_line_property2(ftdi, BITS_8, STOP_BIT_2, NONE, BREAK_ON) < 0) { fprintf(stderr, " ftdi_set_line_property failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Setting Baudrate...\n"); if(ftdi_set_baudrate(ftdi, 250000) < 0) { fprintf(stderr, " ftdi_set_baudrate failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Setting Flow Ctrl...\n"); if(ftdi_setflowctrl(ftdi, SIO_RESET) < 0) { fprintf(stderr, " ftdi_set_setflowctrl failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Purging Buffers...\n"); if(ftdi_usb_purge_buffers(ftdi) < 0) { fprintf(stderr, " ftdi_usb_purge_buffers failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } fprintf(stdout, "Setting RTS...\n"); if(ftdi_setrts(ftdi, SIO_SET_RTS_HIGH) < 0) { fprintf(stderr, " ftdi_setrts failed\n"); fprintf(stderr, "%s\n", ftdi_get_error_string(ftdi)); exit -1; } ftdi_read_data_set_chunksize(ftdi, 513); ftdi_read_data_get_chunksize(ftdi, &tmp); fprintf(stdout, "Chunksize = %d\n", tmp); signal(SIGINT, sigintHandler); fprintf(stdout, "Starting Loop...\n"); while(!exitRequested) { ftdi_poll_modem_status(ftdi, &status); if(status & 0x1000) { // BREAK_INTERRUPT f = ftdi_read_data(ftdi, buff, sizeof(buff)); if(f < 0) sleep(1); else if(f > 0) { fprintf(stdout, "Read %d bytes\n", f); for(i = 0; i < sizeof(buff); i++) { fprintf(stdout, "%02X ", ((unsigned char *) buff)[i] ); } fprintf(stdout, "\n"); fflush(stdout); } } // BREAK INTERRUPT } signal(SIGINT, SIG_DFL); ftdi_usb_close(ftdi); ftdi_free(ftdi); return 0; }