#include "rs232config.h" #include #include #include #include #include #ifdef HAVE_WINDOWS_H #include #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