#include #include #include #include #include #include "rs232config.h" #ifdef HAVE_TERMIOS_H #include #endif #ifdef HAVE_TERMIO_H #include #endif #include "RS232.h" #ifdef HAVE_WINDOWS_H #else #ifdef HAVE_TERMIOS_H rs232speed_t rs232cfspeed(unsigned int BaudeRate); rs232port_t rs232open(char* psPortName) { rs232port_t fd; fd = open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY); fcntl(fd, F_SETFL, 0); //fd = open(psPortName, O_RDWR | O_NOCTTY); #ifdef debug if(fd==-1)printf("can't open Port\n"); #endif return fd; } int rs232close(rs232port_t fd) { if ((int)fd == -1) { return -1; } else { close(fd); return 0; } } int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop) { if ((int)fd == -1) { return -1; } else { struct termios terminos; tcgetattr(fd, &terminos); cfsetispeed(&terminos, rs232cfspeed(BaudeRate)); cfsetospeed(&terminos, rs232cfspeed(BaudeRate)); terminos.c_cflag |= (CLOCAL | CREAD); rs232cfparity(fd, &terminos, Parity); rs232cfnbstop(fd, &terminos, NbStop); rs232cfcsize(fd, &terminos, ChSize); terminos.c_cc[VMIN]=0; terminos.c_cc[VTIME]=1; tcflush(fd, TCIFLUSH); #ifdef debug if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n"); #else tcsetattr(fd, TCSANOW, &terminos); #endif return 0; } } int rs232setbaudrate(rs232port_t fd, int baudrate) { if ((int)fd == -1) { return fd; } else { struct termios terminos; tcgetattr(fd, &terminos); cfsetispeed(&terminos, rs232cfspeed(baudrate)); cfsetospeed(&terminos, rs232cfspeed(baudrate)); tcsetattr(fd, TCSANOW, &terminos); return 0; } } int rs232setparity(rs232port_t fd, rs232parity Parity) { if ((int)fd == -1) { return fd; } else { struct termios terminos; tcgetattr(fd, &terminos); terminos.c_cflag &= ~PARENB; terminos.c_cflag &= ~PARODD; switch(Parity) { case rs232parityNo: terminos.c_cflag &= ~PARENB; break; case rs232parityOdd: terminos.c_cflag |= PARENB; terminos.c_cflag |= PARODD; break; case rs232parityEven: terminos.c_cflag |= PARENB; terminos.c_cflag &= ~PARODD; break; default: terminos.c_cflag &= ~PARENB; break; } tcsetattr(fd, TCSANOW, &terminos); return 0; } } int rs232setnbstop(rs232port_t fd, rs232stop NbStop) { if ((int)fd == -1) { return fd; } else { struct termios terminos; tcgetattr(fd, &terminos); switch(NbStop) { case 2: terminos.c_cflag |= CSTOPB; break; default: terminos.c_cflag &= ~CSTOPB; break; } tcsetattr(fd, TCSANOW, &terminos); return 0; } } int rs232setcsize(rs232port_t fd, int ChSize) { if ((int)fd == -1) { return fd; } else { struct termios terminos; tcgetattr(fd, &terminos); terminos.c_cflag &= ~CSIZE; switch(ChSize) { case 5: terminos.c_cflag |= CS5; break; case 6: terminos.c_cflag |= CS6; break; case 7: terminos.c_cflag |= CS7; break; default: terminos.c_cflag |= CS8; break; } tcsetattr(fd, TCSANOW, &terminos); return 0; } } rs232speed_t rs232cfspeed(unsigned int BaudeRate) { if(BaudeRate<25) return B0; if(BaudeRate<67) return B50; if(BaudeRate<93) return B75; if(BaudeRate<123) return B110; if(BaudeRate<142) return B134; if(BaudeRate<175) return B150; if(BaudeRate<250) return B200; if(BaudeRate<450) return B300; if(BaudeRate<900) return B600; if(BaudeRate<1500) return B1200; if(BaudeRate<2100) return B1800; if(BaudeRate<3600) return B2400; if(BaudeRate<7200) return B4800; if(BaudeRate<1400) return B9600; if(BaudeRate<28800) return B19200; if(BaudeRate<48000) return B38400; if(BaudeRate<86400) return B57600; if(BaudeRate<172800) return B115200; else return B230400; } int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity) { if ((int)fd == -1) { return fd; } else { terminos->c_cflag &= ~PARENB; terminos->c_cflag &= ~PARODD; switch(Parity) { case rs232parityNo: terminos->c_cflag &= ~PARENB; terminos->c_cflag &= ~PARODD; break; case rs232parityOdd: terminos->c_cflag |= PARENB; terminos->c_cflag |= PARODD; break; case rs232parityEven: terminos->c_cflag |= PARENB; terminos->c_cflag &= ~PARODD; break; default: terminos->c_cflag &= ~PARENB; terminos->c_cflag &= ~PARODD; break; } return 0; } } int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop) { if ((int)fd == -1) { return fd; } else { switch(NbStop) { case 2: terminos->c_cflag |= CSTOPB; break; default: terminos->c_cflag &= ~CSTOPB; break; } return 0; } } int rs232cfcsize(int fd, struct termios *terminos, int ChSize) { if ((int)fd == -1) { return fd; } else { terminos->c_cflag &= ~CSIZE; switch(ChSize) { case 5: terminos->c_cflag |= CS5; break; case 6: terminos->c_cflag |= CS6; break; case 7: terminos->c_cflag |= CS7; break; default: terminos->c_cflag |= CS8; break; } return 0; } } int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize) { if ((int)fd == -1) { return -1; } else { return write(fd, psWrite, WriteBufferSize); } } int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize) { if ((int)fd == -1) { return -1; } else { return read(fd, psReadHex, ReadBufferSize); } } int rs232setRTS(rs232port_t fd) { int status; ioctl(fd, TIOCMGET, &status); status &= ~TIOCM_RTS; if (ioctl(fd, TIOCMSET, &status)) { return -1; } return 0; } int rs232clearRTS(rs232port_t fd) { int status; ioctl(fd, TIOCMGET, &status); status |= TIOCM_RTS; if (ioctl(fd, TIOCMSET, &status)) { return -1; } return 0; } int rs232setDTR(rs232port_t fd) { int status; ioctl(fd, TIOCMGET, &status); status &= ~TIOCM_DTR; if (ioctl(fd, TIOCMSET, &status)) { return -1; } return 0; } int rs232clearDTR(rs232port_t fd) { int status; ioctl(fd, TIOCMGET, &status); status |= TIOCM_DTR; if (ioctl(fd, TIOCMSET, &status)) { return -1; } return 0; } int rs232saferead(rs232port_t fd,char* data,int count ) { int read=0; int i=0; for(i=0;i<100;i++) { read = rs232read(fd,data,count); count -=read; data+=read; if(count==0) return 0; } return -1; } int rs232safewrite(rs232port_t fd,char* data,int count) { int written=0; int i=0; for(i=0;i<1000;i++) { written = rs232write(fd,data+written,count); count-=written; data+=written; if(count==0) return 0; } return -1; } #endif #endif //#ifdef HAVE_TERMIOS_H