#include #include #include #include #include #include "rs232config.h" #ifdef HAVE_TERMIOS_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); 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); tcsetattr(fd, TCSANOW, &terminos); 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 = Parity; tcsetattr(fd, TCSANOW, &terminos); return 0; } } int rs232setnbstop(rs232port_t fd, int 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); 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 = Parity; 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 { 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); } } #endif #endif //#ifdef HAVE_TERMIOS_H