RS232.c
220 lines
| 3.0 KiB
| text/x-c
|
CLexer
r0 | // SOPSUYSI_RS232.c - Function to communicate on Serial Port | |||
#include <stdio.h> | ||||
#include <unistd.h> | ||||
#include <fcntl.h> | ||||
#include <termios.h> | ||||
#include <string.h> | ||||
#include <errno.h> | ||||
#include "RS232.h" | ||||
speed_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 | ||||
// if(172799<BaudeRate) | ||||
return B230400; | ||||
} | ||||
int rs232cfparity(int fd, struct termios *terminos, int Parity) | ||||
{ | ||||
if (fd == -1) | ||||
{ | ||||
return fd; | ||||
} | ||||
else | ||||
{ | ||||
switch(Parity) | ||||
{ | ||||
case 1: | ||||
terminos->c_cflag |= PARENB; | ||||
break; | ||||
default: | ||||
terminos->c_cflag &= ~PARENB; | ||||
break; | ||||
} | ||||
return 0; | ||||
} | ||||
} | ||||
int rs232cfnbstop(int fd, struct termios *terminos, int NbStop) | ||||
{ | ||||
if (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 (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 rs232open(char* psPortName) | ||||
{ | ||||
int fd = open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY); | ||||
return fd; | ||||
} | ||||
int rs232setup(int fd, int ChSize, int BaudeRate, int Parity, int NbStop) | ||||
{ | ||||
if (fd == -1) | ||||
{ | ||||
return fd; | ||||
} | ||||
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); | ||||
tcgetattr(fd, &terminos); | ||||
return 0; | ||||
} | ||||
} | ||||
int rs232write(int fd,char *psWrite) | ||||
{ | ||||
int Len_psWrite = (int)strlen(psWrite); | ||||
if (fd == -1) | ||||
{ | ||||
return fd; | ||||
} | ||||
else | ||||
{ | ||||
|
r1 | return write(fd, psWrite, Len_psWrite); | ||
} | ||||
} | ||||
r0 | ||||
|
r1 | int rs232read(int fd,char *psReadHex, int ReadBufferSize) | ||
{ | ||||
if (fd == -1) | ||||
{ | ||||
return fd; | ||||
} | ||||
else | ||||
{ | ||||
return read(fd, psReadHex, ReadBufferSize); | ||||
r0 | } | |||
} | ||||
int rs232close(int fd) | ||||
{ | ||||
if (fd == -1) | ||||
{ | ||||
return fd; | ||||
} | ||||
else | ||||
{ | ||||
close(fd); | ||||
return 0; | ||||
} | ||||
} | ||||