##// END OF EJS Templates
Removed stupid error on Win32 for port enumeration but not tested yet!
Removed stupid error on Win32 for port enumeration but not tested yet!

File last commit:

r34:981d3945a0ec alexis
r35:0e868a37e6ff alexis
Show More
RS232_unix.c
516 lines | 9.1 KiB | text/x-c | CLexer
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 #include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Satrted Port enumeration feature.
r33 #include <malloc.h>
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 #include <dirent.h>
#include <limits.h>
#include <stdlib.h>
#include <sys/stat.h>
yannic
Included Config file for setup.
r7 #include "rs232config.h"
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 #ifdef HAVE_TERMIOS_H
#include <termios.h>
#endif
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 #ifdef HAVE_TERMIO_H
#include <termio.h>
#endif
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 #include "RS232.h"
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 #ifdef HAVE_WINDOWS_H
#else
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 #ifdef HAVE_TERMIOS_H
rs232speed_t rs232cfspeed(unsigned int BaudeRate);
rs232port_t rs232open(char* psPortName)
{
rs232port_t fd;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 fd = (rs232port_t)open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY);
fcntl((int)fd, F_SETFL, 0);
some linux bug fixes, added timeouts for read actions
r12 //fd = open(psPortName, O_RDWR | O_NOCTTY);
yannic
Improved linux support
r11 #ifdef debug
if(fd==-1)printf("can't open Port\n");
#endif
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return fd;
}
int rs232close(rs232port_t fd)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return -1;
}
else
{
close(fd);
return 0;
}
}
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Satrted Port enumeration feature.
r33 rs232portslist_t* rs232getportlist()
{
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 struct dirent *dp;
char* path="/dev/serial/by-id";
DIR *dir = opendir(path);
rs232portslist_t* firstitem=NULL;
rs232portslist_t* previtem=NULL;
char linkname[1024];
int i=0;
if(dir!=NULL)
{
while ((dp=readdir(dir)) != NULL)
{
char* name = (char*)malloc(1024);
for(i=0;i<1024;i++)
{
name[i]='\0';
linkname[i]='\0';
}
struct stat statbuf;
strcpy(linkname,path);
strcat(linkname,"/");
strcat(linkname,dp->d_name);
lstat(linkname, &statbuf);
if(S_ISLNK(statbuf.st_mode))
{
if(-1!=readlink(linkname,name,1024))
{
for(i=0;i<1024;i++)
{
linkname[i]='\0';
}
strcpy(linkname,path);
strcat(linkname,"/");
strcat(linkname,name);
for(i=0;i<1024;i++)
{
name[i]='\0';
}
if(NULL!=realpath(linkname, name))
{
rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t));
item->name = name;
item->next = NULL;
if(NULL!=previtem)previtem->next = item;
previtem = item;
if(NULL==firstitem)firstitem = item;
}
}
}
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Satrted Port enumeration feature.
r33
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 }
}
return firstitem;
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Satrted Port enumeration feature.
r33 }
void rs232deleteportlist(rs232portslist_t* list)
{
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 if(list!=NULL)
{
if(list->next != NULL)
rs232deleteportlist(list->next);
free(list);
}
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Satrted Port enumeration feature.
r33 }
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return -1;
}
else
{
struct termios terminos;
tcgetattr(fd, &terminos);
cfsetispeed(&terminos, rs232cfspeed(BaudeRate));
cfsetospeed(&terminos, rs232cfspeed(BaudeRate));
terminos.c_cflag |= (CLOCAL | CREAD);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 rs232cfparity((int)fd, &terminos, Parity);
rs232cfnbstop((int)fd, &terminos, NbStop);
rs232cfcsize((int)fd, &terminos, ChSize);
some linux bug fixes, added timeouts for read actions
r12 terminos.c_cc[VMIN]=0;
Now totaly stable on linux read timeout = 100ms
r13 terminos.c_cc[VTIME]=1;
some linux bug fixes, added timeouts for read actions
r12 tcflush(fd, TCIFLUSH);
yannic
Improved linux support
r11 #ifdef debug
if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n");
#else
tcsetattr(fd, TCSANOW, &terminos);
#endif
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return 0;
}
}
int rs232setbaudrate(rs232port_t fd, int baudrate)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
struct termios terminos;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcgetattr((int)fd, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 cfsetispeed(&terminos, rs232cfspeed(baudrate));
cfsetospeed(&terminos, rs232cfspeed(baudrate));
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcsetattr((int)fd, TCSANOW, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return 0;
}
}
int rs232setparity(rs232port_t fd, rs232parity Parity)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
struct termios terminos;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcgetattr((int)fd, &terminos);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos.c_cflag &= ~PARENB;
terminos.c_cflag &= ~PARODD;
yannic
Improved linux support
r11 switch(Parity)
{
case rs232parityNo:
jeandet@pc-de-jeandet3.lab-lpp.local
fixed bug on Parity hndling under linux!
r25 terminos.c_cflag &= ~PARENB;
yannic
Improved linux support
r11 break;
case rs232parityOdd:
jeandet@pc-de-jeandet3.lab-lpp.local
fixed bug on Parity hndling under linux!
r25 terminos.c_cflag |= PARENB;
terminos.c_cflag |= PARODD;
yannic
Improved linux support
r11 break;
case rs232parityEven:
jeandet@pc-de-jeandet3.lab-lpp.local
fixed bug on Parity hndling under linux!
r25 terminos.c_cflag |= PARENB;
terminos.c_cflag &= ~PARODD;
yannic
Improved linux support
r11 break;
default:
terminos.c_cflag &= ~PARENB;
break;
}
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcsetattr((int)fd, TCSANOW, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return 0;
}
}
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
RAS
r9 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
struct termios terminos;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcgetattr((int)fd, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 switch(NbStop)
{
jeandet@PC-DE-JEANDET.lab-lpp.local
Fixed errors for windows
r32 case rs232OneStop:
terminos.c_cflag &= ~CSTOPB;
break;
case rs232One5Stop:
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 terminos.c_cflag |= CSTOPB;
jeandet@PC-DE-JEANDET.lab-lpp.local
Fixed errors for windows
r32 break;
case rs232TwoStop:
terminos.c_cflag |= CSTOPB;
break;
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 default:
terminos.c_cflag &= ~CSTOPB;
jeandet@PC-DE-JEANDET.lab-lpp.local
Fixed errors for windows
r32 break;
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 }
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcsetattr((int)fd, TCSANOW, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return 0;
}
}
int rs232setcsize(rs232port_t fd, int ChSize)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
struct termios terminos;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcgetattr((int)fd, &terminos);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos.c_cflag &= ~CSIZE;
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 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;
}
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 tcsetattr((int)fd, TCSANOW, &terminos);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 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)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag &= ~PARENB;
terminos->c_cflag &= ~PARODD;
yannic
Improved linux support
r11 switch(Parity)
{
case rs232parityNo:
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag &= ~PARENB;
terminos->c_cflag &= ~PARODD;
yannic
Improved linux support
r11 break;
case rs232parityOdd:
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag |= PARENB;
terminos->c_cflag |= PARODD;
yannic
Improved linux support
r11 break;
case rs232parityEven:
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag |= PARENB;
terminos->c_cflag &= ~PARODD;
yannic
Improved linux support
r11 break;
default:
terminos->c_cflag &= ~PARENB;
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag &= ~PARODD;
yannic
Improved linux support
r11 break;
}
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 return 0;
}
}
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
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)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return fd;
}
else
{
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 terminos->c_cflag &= ~CSIZE;
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 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)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return -1;
}
else
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return write((int)fd, psWrite, WriteBufferSize);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 }
}
int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize)
{
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 if ((int)fd == -1)
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 {
return -1;
}
else
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return read((int)fd, psReadHex, ReadBufferSize);
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5 }
}
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26
int rs232setRTS(rs232port_t fd)
{
int status;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 ioctl((int)fd, TIOCMGET, &status);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 status &= ~TIOCM_RTS;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (ioctl((int)fd, TIOCMSET, &status))
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 {
return -1;
}
return 0;
}
int rs232clearRTS(rs232port_t fd)
{
int status;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 ioctl((int)fd, TIOCMGET, &status);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 status |= TIOCM_RTS;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (ioctl((int)fd, TIOCMSET, &status))
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 {
return -1;
}
return 0;
}
int rs232setDTR(rs232port_t fd)
{
int status;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 ioctl((int)fd, TIOCMGET, &status);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 status &= ~TIOCM_DTR;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (ioctl((int)fd, TIOCMSET, &status))
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 {
return -1;
}
return 0;
}
int rs232clearDTR(rs232port_t fd)
{
int status;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 ioctl((int)fd, TIOCMGET, &status);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 status |= TIOCM_DTR;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (ioctl((int)fd, TIOCMSET, &status))
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 {
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++)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 read = rs232read((int)fd,data,count);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 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++)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 written = rs232write((int)fd,data+written,count);
jeandet@pc-de-jeandet3.lab-lpp.local
Added RTS and CTS signal handing, saffer read and write functions....
r26 count-=written;
data+=written;
if(count==0)
return 0;
}
return -1;
}
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
fixed some read bugs (under windows)
r8 #endif
#endif //#ifdef HAVE_TERMIOS_H
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
Win/Unix portability completed, need to be tested.
r5