Hi, i'm working on a driver for the ORGA ECO 5000 cardreader. But the "serial.c" - file (provided with the CT-skeleton sources) doesn't seem to work. I get a handle to "/dev/ttyS0" for example, but other functions (like tcgetattr(handle, ...)) shutdown with an error (-1). Where is the problem ?? I changed some part of the sources (eliminated MAC support), but this is (I hope) not the reason. I also have to set the RTS-Line off to communicate with the cardreader. Otherwise i don't get a response. (ACK or NACK) Which parameters do i have to change or set in the termios-structure. I attached the modified "serial.c"-file. Please take a look at it. If there are any questions, please contact me!! Thank you so much for your support. ;-> Bye, Frank
/* * NAME: * serial.c -- Copyright (C) 1998 David Corcoran * * DESCRIPTION: * This provides Unix/Mac serial driver support * * AUTHOR: * David Corcoran, 7/22/98 * * Modified by Mark Hartman for Macintosh support, 7/15/98 * * LICENSE: See file LICENSE. * */ #include <stdio.h> /* Standard Includes */ #include <string.h> #include <unistd.h> #include <fcntl.h> #include <assert.h> #include <string.h> #include "serial.h" #include <termios.h> #include <sys/signal.h> #include <sys/types.h> #include <sys/time.h> struct IO_Specs { HANDLE handle; BYTE baud; BYTE bits; char parity; long blocktime; } ioport; static char _rcsid[] UNUSED = "$Id$"; /* * InititalizePort -- initialize a serial port * This functions opens the serial port specified and sets the * line parameters baudrate, bits per byte and parity according to the * parameters. If no serial port is specified, the Communications * Manager's dialog is invoked to permit the user to select not only * the port, but all the other (baud/bits/parity) details as well. * Selections made by the user in this case will override the * parameters passed. */ bool IO_InitializePort(int baud, int bits, char parity, char* port) { /* UNIX SERIAL SUPPORT */ HANDLE handle; struct termios newtio; handle = open(port, O_RDWR); /* Try user input depending on port */ if (handle < 0) { /* Problems with /dev/smartcard */ return -1; } if(tcgetattr(handle, &newtio)<0) { close(handle); return -100; }; /* * Set the baudrate */ switch (baud) { case 9600: /* Baudrate 9600 */ newtio.c_cflag = B9600; break; case 19200: /* Baudrate 19200 */ newtio.c_cflag = B19200; break; default: close(handle); return -2; } /* * Set the bits. */ switch (bits) { case 5: /* Five bits */ newtio.c_cflag |= CS5; break; case 6: /* Six bits */ newtio.c_cflag |= CS6; break; case 7: /* Seven bits */ newtio.c_cflag |= CS7; break; case 8: /* Eight bits */ newtio.c_cflag |= CS8; break; default: close(handle); return -3; } /* * Set the parity (Odd Even None) */ switch (parity) { case 'O': /* Odd Parity */ newtio.c_cflag |= PARODD | PARENB | INPCK; break; case 'E': /* Even Parity */ newtio.c_cflag &= (~PARODD); newtio.c_cflag |= PARENB | INPCK; break; case 'N': /* No Parity */ break; default: close(handle); return -4; } /* * Setting Raw Input and Defaults */ newtio.c_cflag |= CREAD|HUPCL|CLOCAL; newtio.c_iflag &= ~(IGNPAR|PARMRK|INLCR|IGNCR|ICRNL); newtio.c_iflag |= BRKINT; newtio.c_lflag &= ~(ICANON|ECHO|ISTRIP); newtio.c_cflag |=CRTSCTS; newtio.c_iflag &= ~(IXON | IXOFF | IXANY); newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 0; if (tcflush(handle, TCIFLUSH) < 0) { /* Flush the serial port */ close(handle); return -5; }; if(tcsetattr(handle, TCSANOW, &newtio) < 0) { close(handle); return -6; }; ioport.handle = handle; /* Record the handle */ ioport.baud = baud; /* Record the baudrate */ ioport.bits = bits; /* Record the bits */ ioport.parity = parity; /* Record the parity */ ioport.blocktime = 1; /* Default Beginning Blocktime */ return TRUE; } HANDLE IO_ReturnHandle() { return ioport.handle; /* Return the current used handle */ } int IO_UpdateReturnBlock(int blocktime) { /* Sets the blocking timeout value */ ioport.blocktime = (long)blocktime; /* For Unix seconds by default */ return ioport.blocktime; /* Return the current blocktime */ } int IO_ReturnBaudRate() { return ioport.baud; /* Return the current baudrate */ } bool IO_FlushBuffer() { HANDLE handle = ioport.handle; if (tcflush(handle, TCIFLUSH) == 0) return TRUE; return FALSE; } bool IO_Read( int readsize, BYTE *response ) { fd_set rfds; struct timeval tv; int rval; BYTE c; HANDLE handle; int count = 0; handle = ioport.handle; tv.tv_sec = ioport.blocktime; tv.tv_usec = 0; FD_ZERO(&rfds); for (count=0; count < readsize; count++) { FD_SET(handle, &rfds); rval = select (handle+1, &rfds, NULL, NULL, &tv); if (FD_ISSET(handle, &rfds)) { read(handle, &c, 1); response[count] = c; } else { tcflush(handle, TCIFLUSH); return FALSE; } } return TRUE; } bool IO_Write(BYTE c) { HANDLE handle = ioport.handle; tcflush(handle, TCIFLUSH); /* Flush the port */ if (write(handle, &c, 1) == 1) /* Write one byte */ return TRUE; return FALSE; } bool IO_Close() { HANDLE handle = ioport.handle; if ( close (handle) == 0 ) { /* Close the handle */ return TRUE; } else { return FALSE; /* Done ! */ } }