Под Windows необходимо менять код почти полностью.
Код:
#ifndef D2SERIAL_C
#define D2SERIAL_C
#include "d2serial.h"
#include "d2lib.h"
//#include "mini_edt.h"
//H Section
#define __USE_UNIX98
#include "d2lib.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
typedef struct
{
HANDLE fid;
COMMTIMEOUTS commTimeouts;
DCB dcb;
} WIN_SERIAL_PORT_DATA;
speed_spec speeds[] =
{
{"1200", CBR_1200,1200},
{"2400", CBR_2400,2400},
{"4800", CBR_4800,4800},
{"9600", CBR_9600,9600},
{"19200", CBR_19200,19200},
{"38400", CBR_38400,38400},
{"57600", CBR_57600,57600},
{"115200", CBR_115200,115200},
{NULL, 0,0}
};
int get_speed_by_index(int ix)
{
return speeds[ix].flag;
};
int get_speed_by_str(char *name)
{
speed_spec *s;
//int speed;
for (s = speeds; s->name; s++)
{
if (strcmp(s->name, name) == 0)
{
return s->flag;
//return speed;
//fprintf(stderr, "setting speed %s\n", s->name);
//break;
}
}
return 0;
}
int get_speed_by_number(int speed)
{
return speed;
}
void port_get_name(char *dst,int index)
{
//strcpy(dst,"/dev/ttyS")
sprintf(dst,"com%i",(index+1));
}
int open_port(SERIAL_PORT *port)
{
char buf [16];
WIN_SERIAL_PORT_DATA *data;
LPCOMMTIMEOUTS tm;
LPDCB lpDCB;
if (port==NULL) return 1;
if (port->data) close_port(port);
port->fid=-1;
//data=(WIN_SERIAL_PORT_DATA*)port->data;
int speed;
data=(WIN_SERIAL_PORT_DATA*)malloc(sizeof(WIN_SERIAL_PORT_DATA));
port_get_name(buf,port->index);
data->fid=CreateFile(buf,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (data->fid >0)
{
tm=&data->commTimeouts;
lpDCB=&data->dcb;
tm->ReadIntervalTimeout = 1;
tm->ReadTotalTimeoutMultiplier = 0;
tm->ReadTotalTimeoutConstant = 1;
tm->WriteTotalTimeoutMultiplier = 2;
tm->WriteTotalTimeoutConstant = 2;
if (!SetCommTimeouts(data->fid,tm))
{
return 2;
};
if (!SetupComm(data->fid, 4096, 4096)) return 4;
lpDCB->DCBlength=sizeof(DCB);
GetCommState(data->fid,lpDCB);
lpDCB->BaudRate = port->speed;
//lpDCB->Flags=12305;
lpDCB->wReserved=0;
lpDCB->XonLim=600;
lpDCB->XoffLim=150;
lpDCB->ByteSize=8;
lpDCB->Parity=0;
lpDCB->StopBits=0;
lpDCB->XonChar=17;
lpDCB->XoffChar=19;
lpDCB->ErrorChar=0;
lpDCB->EofChar=0;
lpDCB->EvtChar=0;
lpDCB->wReserved1=65;
if (!SetCommState(data->fid, lpDCB)) return 5;
port->fid=(int)data->fid;
if (port->fid<0) port->fid=1;
//out_str2=ok_connect_str;
return 0;//ok open port
}//else out_str2=er_connect_str;
return 3;
}//return 0 if OK ,if error non zero return
int port_read_byte(SERIAL_PORT *port,unsigned char *c)
{
int ret;
DWORD co;
WIN_SERIAL_PORT_DATA* data;
if (port==NULL) return 1;
data=(WIN_SERIAL_PORT_DATA*)port->data;
if (data)
{
if (!ReadFile(data->fid, c, 1, &co, NULL)) return 2;
if (co==0) return 1;
return 0;
}
return 3;
}//return 0 if OK ,if error non zero return
int port_write_byte(SERIAL_PORT *port,unsigned char c)
{
if (port==NULL) return 1;
int ret;
DWORD co;
WIN_SERIAL_PORT_DATA* data=(WIN_SERIAL_PORT_DATA*)port->data;
if (data)
{
if (!WriteFile(data->fid, &c, 1, &co, NULL)) return 2;
if (co==0) return 1;
return 0;
}
return 3;
}//return 0 if OK ,if error non zero return
int close_port(SERIAL_PORT *port)
{
if (port==NULL) return 1;
WIN_SERIAL_PORT_DATA* data=(WIN_SERIAL_PORT_DATA*)port->data;
if (data)
{
// if (port->fid>-1){
CloseHandle(data->fid);
//tcsetattr(port->fid,TCSANOW,(struct termios*)(port->data));
free(data);
port->data=NULL;
}
port->fid=-1;
//};
return 0;
}
;//return 0 if OK ,if error non zero return
//int read_byte(int from, char *c);
int read_byte(int from,unsigned char *c)
{
int ret;
do
{
ret = read(from, &c, 1);
}
while (ret < 0 && errno == EINTR);
if (ret == 1)
{
return 0;
}
return -2;
}
#endif