|
Hello Thomas, I did a ftdi_read_data_set_chunksize(ftdi, 513) and commented out the purge, still the data I'm receiving is not 'correct' there are 512 positions (the 1st of the 513 array is the start code which is always 0x00) which correspond to a DMX channel, and I keep getting the correct value but always on the wrong array positions, they keep changing. Also, the break interrupt seems to be slower than what it should be. Attached goes my latest test code. Best regards, On 05/30/2012 05:57 PM, Thomas Jarosch wrote: Hi Rui, On Wednesday, 30. May 2012 17:09:04 Rui Barreiros wrote: --
libftdi - see http://www.intra2net.com/en/developer/libftdi for details. | ||||||
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <ftdi.h>
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;
}

