##// END OF EJS Templates
Added int rs232availablebytes(rs232port_t fd); in API....
Added int rs232availablebytes(rs232port_t fd); in API. Only tested on Linux yet.

File last commit:

r49:5dbc0917d8e7 qt
r49:5dbc0917d8e7 qt
Show More
RS232_win.c
395 lines | 8.6 KiB | text/x-c | CLexer
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 #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-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
Jeandet Alexis
Changed to qmake build system.
r44 #include <windows.h>
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 #include "RS232.h"
Jeandet Alexis
Added char to Wchar conversion.
r46 #include <locale.h>
Jeandet Alexis
Changed to qmake build system.
r44
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 int privatedecodeparity(rs232parity Parity )
{
switch(Parity)
{
case rs232parityNo:
return NOPARITY;
break;
case rs232parityOdd:
return ODDPARITY;
break;
case rs232parityEven:
return EVENPARITY;
break;
default:
return NOPARITY;
break;
}
}
int privatedecodestop(rs232stop NbStop)
{
switch(NbStop)
{
case rs232OneStop:
return ONESTOPBIT;
break;
case rs232One5Stop:
return ONE5STOPBITS;
break;
case rs232TwoStop:
return TWOSTOPBITS;
break;
jeandet@PC-DE-JEANDET.lab-lpp.local
Fixed errors for windows
r32 default:
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return ONESTOPBIT;
break;
}
}
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
rs232speed_t rs232cfspeed(unsigned int BaudeRate)
{
if(BaudeRate<123)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_110;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<450)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_300;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<900)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_600;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<1500)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_1200;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<3600)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_2400;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<7200)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_4800;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<14000)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_9600;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<16800)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_14400;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<28800)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_19200;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<48000)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_38400;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<86400)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_57600;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
if(BaudeRate<172800)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232speed_t)CBR_115200;
Jeandet Alexis
added 3Mbaud for win32
r42
if(BaudeRate<345600)
return (rs232speed_t)230400;
if(BaudeRate<345600)
return (rs232speed_t)460800;
if(BaudeRate<748800)
return (rs232speed_t)576000;
if(BaudeRate<1210800)
return (rs232speed_t)921600;
if(BaudeRate<1750000)
return (rs232speed_t)1500000;
if(BaudeRate<2250000)
return (rs232speed_t)2000000;
if(BaudeRate<2750000)
return (rs232speed_t)2500000;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 else
Jeandet Alexis
added 3Mbaud for win32
r42 return (rs232speed_t)3000000;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
rs232port_t rs232open(char* psPortName)
{
rs232port_t fd;
Jeandet Alexis
Added char to Wchar conversion.
r46 /* Char to Wchar conversion*/
Jeandet Alexis
An other char to wchar conv
r47 int neededSize = MultiByteToWideChar(CP_ACP, 0, psPortName, -1, 0, 0);
Jeandet Alexis
Fixed wchar issue!
r48 wchar_t* wcstr = (wchar_t*)malloc(sizeof(wchar_t)*neededSize);
MultiByteToWideChar(CP_ACP, 0, psPortName, -1, wcstr, neededSize);
Jeandet Alexis
Added char to Wchar conversion.
r46 fd = (rs232port_t)CreateFile(wcstr,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
Jeandet Alexis
Fixed wchar issue!
r48 free(wcstr);
Jeandet Alexis
An other char to wchar conv
r47 #ifdef RS232_debug
jeandet@PC-DE-JEANDET.lab-lpp.local
Fixed errors for windows
r32 if(fd==(rs232port_t)INVALID_HANDLE_VALUE)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 {
printf("can't open Port\n");
return (rs232port_t)badPortValue;
}
#endif
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return fd;
}
int rs232close(rs232port_t fd)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 CloseHandle((HANDLE)fd);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 rs232portslist_t* rs232getportlist() //here is the very dirty way!
{
int i=0;
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Removed stupid error on Win32 for port enumeration but not tested yet!
r35 char devName[]="COM111";
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL
Port enumeration Works on linux
r34 rs232port_t testport;
rs232portslist_t* firstitem=NULL;
rs232portslist_t* previtem=NULL;
for(i=0;i<256;i++)
{
devName[3] = '\0';
devName[4] = '\0';
devName[5] = '\0';
devName[6] = '\0';
sprintf(devName+3,"%d",i);
testport= rs232open(devName);
if(testport != (rs232port_t)badPortValue)
{
rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t));
char* name = (char*)malloc(7);
strcpy(name,devName);
item->name = name;
item->next = NULL;
if(NULL!=previtem)previtem->next = item;
previtem = item;
if(NULL==firstitem)firstitem = item;
Removed error on port enumeration on win32, now the ports are correctly closed....
r39 rs232close(testport);
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.lab-lpp.local
Inverted RTS CTS signals.
r29 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 GetCommState((HANDLE)fd, &dcbSerialParams);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate);
dcbSerialParams.ByteSize=ChSize;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 dcbSerialParams.StopBits=privatedecodestop(NbStop);
dcbSerialParams.Parity=privatedecodeparity(Parity);
SetCommState((HANDLE)fd, &dcbSerialParams);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=100;
timeouts.ReadTotalTimeoutConstant=100;
timeouts.ReadTotalTimeoutMultiplier=1;
timeouts.WriteTotalTimeoutConstant=100;
timeouts.WriteTotalTimeoutMultiplier=10;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 SetCommTimeouts((HANDLE)fd, &timeouts);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
int rs232setbaudrate(rs232port_t fd, int baudrate)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 GetCommState((HANDLE)fd, &dcbSerialParams);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 dcbSerialParams.BaudRate=rs232cfspeed(baudrate);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 SetCommState((HANDLE)fd, &dcbSerialParams);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
int rs232setparity(rs232port_t fd, rs232parity Parity)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 GetCommState((HANDLE)fd, &dcbSerialParams);
dcbSerialParams.Parity = privatedecodeparity(Parity);
SetCommState((HANDLE)fd, &dcbSerialParams);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 GetCommState((HANDLE)fd, &dcbSerialParams);
dcbSerialParams.StopBits = privatedecodestop(NbStop);
SetCommState((HANDLE)fd, &dcbSerialParams);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
int rs232setcsize(rs232port_t fd, int ChSize)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 GetCommState((HANDLE)fd, &dcbSerialParams);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 dcbSerialParams.ByteSize = ChSize;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 SetCommState((HANDLE)fd, &dcbSerialParams);
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
}
int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DWORD dwBytesWriten = 0;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 WriteFile((HANDLE)fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return dwBytesWriten;
}
}
int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 {
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return (rs232port_t)badPortValue;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
else
{
DWORD dwBytesRead = 0;
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 ReadFile((HANDLE)fd, psRead, ReadBufferSize, &dwBytesRead, NULL);
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return dwBytesRead;
}
}
Added int rs232availablebytes(rs232port_t fd); in API....
r49 int rs232availablebytes(rs232port_t fd)
{
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError(m_hIDComDev, &dwErrorFlags, &ComStat);
return((int)ComStat.cbInQue);
}
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29
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)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
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)
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 }
return -1;
}
int rs232setRTS(rs232port_t fd)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if(EscapeCommFunction((HANDLE)fd, CLRRTS))
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return -1;
}
int rs232clearRTS(rs232port_t fd)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if(EscapeCommFunction((HANDLE)fd, SETRTS))
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return -1;
}
int rs232setDTR(rs232port_t fd)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if(EscapeCommFunction((HANDLE)fd, CLRDTR))
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return -1;
}
int rs232clearDTR(rs232port_t fd)
{
jeandet@pc-de-jeandet3.lab-lpp.local
removed config file refenrence in headers. -> cleaner install
r31 if(EscapeCommFunction((HANDLE)fd, SETDTR))
return rs232noerr;
jeandet@PC-DE-JEANDET.lab-lpp.local
Inverted RTS CTS signals.
r29 return -1;
}
Jeandet Alexis
Changed to qmake build system.
r44