##// END OF EJS Templates
Added RTS and CTS signal handing, saffer read and write functions....
Added RTS and CTS signal handing, saffer read and write functions. Changed to 2.0.0 version!

File last commit:

r26:c194258da26a alexis
r26:c194258da26a alexis
Show More
RS232_win.c
287 lines | 5.1 KiB | text/x-c | CLexer
#include "rs232config.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#include "RS232.h"
#ifdef HAVE_WINDOWS_H
rs232speed_t rs232cfspeed(unsigned int BaudeRate)
{
if(BaudeRate<123)
return CBR_110;
if(BaudeRate<450)
return CBR_300;
if(BaudeRate<900)
return CBR_600;
if(BaudeRate<1500)
return CBR_1200;
if(BaudeRate<3600)
return CBR_2400;
if(BaudeRate<7200)
return CBR_4800;
if(BaudeRate<14000)
return CBR_9600;
if(BaudeRate<16800)
return CBR_14400;
if(BaudeRate<28800)
return CBR_19200;
if(BaudeRate<48000)
return CBR_38400;
if(BaudeRate<86400)
return CBR_57600;
if(BaudeRate<172800)
return CBR_115200;
else
return CBR_256000;
}
rs232port_t rs232open(char* psPortName)
{
rs232port_t fd;
fd = CreateFile(psPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
return fd;
}
int rs232close(rs232port_t fd)
{
if (fd == badPortValue)
{
return -1;
}
else
{
CloseHandle(fd);
return 0;
}
}
int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
GetCommState(fd, &dcbSerialParams);
dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate);
dcbSerialParams.ByteSize=ChSize;
dcbSerialParams.StopBits=NbStop;
dcbSerialParams.Parity=Parity;
SetCommState(fd, &dcbSerialParams);
COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=10;
timeouts.ReadTotalTimeoutConstant=10;
timeouts.ReadTotalTimeoutMultiplier=1;
timeouts.WriteTotalTimeoutConstant=50;
timeouts.WriteTotalTimeoutMultiplier=10;
SetCommTimeouts(fd, &timeouts);
return 0;
}
}
int rs232setbaudrate(rs232port_t fd, int baudrate)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
GetCommState(fd, &dcbSerialParams);
dcbSerialParams.BaudRate=rs232cfspeed(baudrate);
SetCommState(fd, &dcbSerialParams);
return 0;
}
}
int rs232setparity(rs232port_t fd, rs232parity Parity)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
GetCommState(fd, &dcbSerialParams);
dcbSerialParams.Parity = Parity;
SetCommState(fd, &dcbSerialParams);
return 0;
}
}
int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
GetCommState(fd, &dcbSerialParams);
switch(NbStop)
{
case 2:
dcbSerialParams.StopBits = 2;
break;
default:
dcbSerialParams.StopBits = 1;
break;
}
SetCommState(fd, &dcbSerialParams);
return 0;
}
}
int rs232setcsize(rs232port_t fd, int ChSize)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
GetCommState(fd, &dcbSerialParams);
dcbSerialParams.ByteSize = ChSize;
SetCommState(fd, &dcbSerialParams);
return 0;
}
}
int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DWORD dwBytesWriten = 0;
WriteFile(fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL);
return dwBytesWriten;
}
}
int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize)
{
if (fd == badPortValue)
{
return -1;
}
else
{
DWORD dwBytesRead = 0;
ReadFile(fd, psRead, ReadBufferSize, &dwBytesRead, NULL);
return dwBytesRead;
}
}
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;
}
int rs232setRTS(rs232port_t fd)
{
if(EscapeCommFunction(fd, SETRTS))
return 0;
return -1;
}
int rs232clearRTS(rs232port_t fd)
{
if(EscapeCommFunction(fd, CLRRTS))
return 0;
return -1;
}
int rs232setDTR(rs232port_t fd)
{
if(EscapeCommFunction(fd, SETDTR))
return 0;
return -1;
}
int rs232clearDTR(rs232port_t fd)
{
if(EscapeCommFunction(fd, CLRDTR))
return 0;
return -1;
}
#endif //#ifdef HAVE_WINDOWS_H