##// END OF EJS Templates
rs232read clean
rs232read clean

File last commit:

r1:53f78c15a9b9 default
r1:53f78c15a9b9 default
Show More
RS232.c
220 lines | 3.0 KiB | text/x-c | CLexer
Works on linux, need to be ported to Windows
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
{
yannic
rs232read clean
r1 return write(fd, psWrite, Len_psWrite);
}
}
Works on linux, need to be ported to Windows
r0
yannic
rs232read clean
r1 int rs232read(int fd,char *psReadHex, int ReadBufferSize)
{
if (fd == -1)
{
return fd;
}
else
{
return read(fd, psReadHex, ReadBufferSize);
Works on linux, need to be ported to Windows
r0 }
}
int rs232close(int fd)
{
if (fd == -1)
{
return fd;
}
else
{
close(fd);
return 0;
}
}