baud settings include all posix names, windows allows any divisor
svn path=/trunk/externals/iem/comport/; revision=6072
This commit is contained in:
parent
509a44d087
commit
8aae014491
1 changed files with 85 additions and 43 deletions
|
|
@ -93,10 +93,11 @@ typedef struct comport
|
||||||
#define COMPORT_MAX 99
|
#define COMPORT_MAX 99
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
/* we don't use the table for windos cos we can set the number directly. */
|
||||||
|
/* This may result in more possible baud rates than the table contains. */
|
||||||
|
/*
|
||||||
static long baudspeedbittable[] =
|
static long baudspeedbittable[] =
|
||||||
{
|
{
|
||||||
CBR_256000,
|
|
||||||
CBR_128000,
|
|
||||||
CBR_115200,
|
CBR_115200,
|
||||||
CBR_57600,
|
CBR_57600,
|
||||||
CBR_56000,
|
CBR_56000,
|
||||||
|
|
@ -106,83 +107,114 @@ static long baudspeedbittable[] =
|
||||||
CBR_9600,
|
CBR_9600,
|
||||||
CBR_4800,
|
CBR_4800,
|
||||||
CBR_2400,
|
CBR_2400,
|
||||||
|
CBR_1800,
|
||||||
CBR_1200,
|
CBR_1200,
|
||||||
CBR_600,
|
CBR_600,
|
||||||
CBR_300,
|
CBR_300,
|
||||||
CBR_110
|
CBR_110
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
#else /* _WIN32 */
|
#else /* _WIN32 */
|
||||||
|
|
||||||
#ifdef IRIX
|
#ifdef IRIX
|
||||||
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
|
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
|
||||||
#define TIONREAD FIONREAD /* re map the IOCTL function */
|
#define TIONREAD FIONREAD /* re map the IOCTL function */
|
||||||
#define BAUDRATE_256000 -1
|
#define BAUDRATE_230400 -1
|
||||||
#define BAUDRATE_128000 -1
|
|
||||||
#define BAUDRATE_115200 -1
|
#define BAUDRATE_115200 -1
|
||||||
#define BAUDRATE_57600 -1
|
#define BAUDRATE_57600 -1
|
||||||
#define BAUDRATE_56000 -1
|
|
||||||
#define BAUDRATE_38400 B38400
|
#define BAUDRATE_38400 B38400
|
||||||
#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
|
|
||||||
#else /* IRIX */
|
#else /* IRIX */
|
||||||
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
|
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
|
||||||
#define BAUDRATE_256000 -1
|
#define BAUDRATE_230400 B230400
|
||||||
#define BAUDRATE_128000 -1
|
|
||||||
#define BAUDRATE_115200 B115200
|
#define BAUDRATE_115200 B115200
|
||||||
#define BAUDRATE_57600 B57600
|
#define BAUDRATE_57600 B57600
|
||||||
#define BAUDRATE_56000 B57600 /* 56000 gibts nicht */
|
|
||||||
#define BAUDRATE_38400 B38400
|
#define BAUDRATE_38400 B38400
|
||||||
#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
|
|
||||||
#endif /* else IRIX */
|
#endif /* else IRIX */
|
||||||
|
|
||||||
static
|
static
|
||||||
short baudspeedbittable[] =
|
long baudspeedbittable[] =
|
||||||
{
|
{
|
||||||
BAUDRATE_256000, /* CPU SPECIFIC */
|
BAUDRATE_230400,
|
||||||
BAUDRATE_128000, /* CPU SPECIFIC */
|
|
||||||
BAUDRATE_115200, /* CPU SPECIFIC */
|
BAUDRATE_115200, /* CPU SPECIFIC */
|
||||||
BAUDRATE_57600, /* CPU SPECIFIC */
|
BAUDRATE_57600, /* CPU SPECIFIC */
|
||||||
BAUDRATE_56000,
|
|
||||||
BAUDRATE_38400, /* CPU SPECIFIC */
|
BAUDRATE_38400, /* CPU SPECIFIC */
|
||||||
B19200,
|
B19200,
|
||||||
BAUDRATE_14400,
|
|
||||||
B9600,
|
B9600,
|
||||||
B4800,
|
B4800,
|
||||||
B2400,
|
B2400,
|
||||||
|
B1800,
|
||||||
B1200,
|
B1200,
|
||||||
B600,
|
B600,
|
||||||
B300,
|
B300,
|
||||||
B110
|
B200,
|
||||||
|
B150,
|
||||||
|
B134,
|
||||||
|
B110,
|
||||||
|
B75,
|
||||||
|
B50,
|
||||||
|
B0
|
||||||
};
|
};
|
||||||
|
|
||||||
struct timeval null_tv;
|
struct timeval null_tv;
|
||||||
|
|
||||||
#endif /* else _WIN32 */
|
#endif /* else _WIN32 */
|
||||||
|
|
||||||
#define BAUDRATETABLE_LEN 15
|
#define BAUDRATETABLE_LEN 19
|
||||||
|
|
||||||
static long baudratetable[] =
|
static long baudratetable[] =
|
||||||
{
|
{
|
||||||
256000L,
|
230400L,
|
||||||
128000L,
|
|
||||||
115200L,
|
115200L,
|
||||||
57600L,
|
57600L,
|
||||||
56000L,
|
|
||||||
38400L,
|
38400L,
|
||||||
19200L,
|
19200L,
|
||||||
14400L,
|
|
||||||
9600L,
|
9600L,
|
||||||
4800L,
|
4800L,
|
||||||
2400L,
|
2400L,
|
||||||
|
1800L,
|
||||||
1200L,
|
1200L,
|
||||||
600L,
|
600L,
|
||||||
300L,
|
300L,
|
||||||
110L
|
200L,
|
||||||
|
150L,
|
||||||
|
134L,
|
||||||
|
110L,
|
||||||
|
75L,
|
||||||
|
50L,
|
||||||
|
0L
|
||||||
|
|
||||||
}; /* holds the baud rate selections */
|
}; /* holds the baud rate selections */
|
||||||
|
|
||||||
|
/* From man cfsetospeed:
|
||||||
|
cfsetospeed() sets the output baud rate stored in the
|
||||||
|
termios structure pointed to by termios_p to speed, which
|
||||||
|
must be one of these constants:
|
||||||
|
B0
|
||||||
|
B50
|
||||||
|
B75
|
||||||
|
B110
|
||||||
|
B134
|
||||||
|
B150
|
||||||
|
B200
|
||||||
|
B300
|
||||||
|
B600
|
||||||
|
B1200
|
||||||
|
B1800
|
||||||
|
B2400
|
||||||
|
B4800
|
||||||
|
B9600
|
||||||
|
B19200
|
||||||
|
B38400
|
||||||
|
B57600
|
||||||
|
B115200
|
||||||
|
B230400
|
||||||
|
The zero baud rate, B0, is used to terminate the connec
|
||||||
|
tion. If B0 is specified, the modem control lines shall
|
||||||
|
no longer be asserted. Normally, this will disconnect the
|
||||||
|
line.*/
|
||||||
|
|
||||||
t_class *comport_class;
|
t_class *comport_class;
|
||||||
|
|
||||||
static long get_baud_ratebits(t_float *baud);
|
|
||||||
static void comport_pollintervall(t_comport *x, t_floatarg g);
|
static void comport_pollintervall(t_comport *x, t_floatarg g);
|
||||||
static void comport_tick(t_comport *x);
|
static void comport_tick(t_comport *x);
|
||||||
static float set_baudrate(t_comport *x,t_float baud);
|
static float set_baudrate(t_comport *x,t_float baud);
|
||||||
|
|
@ -203,6 +235,7 @@ static HANDLE close_serial(t_comport *x);
|
||||||
#else
|
#else
|
||||||
static int open_serial(unsigned int com_num, t_comport *x);
|
static int open_serial(unsigned int com_num, t_comport *x);
|
||||||
static int close_serial(t_comport *x);
|
static int close_serial(t_comport *x);
|
||||||
|
static long get_baud_ratebits(t_float *baud);
|
||||||
#endif
|
#endif
|
||||||
static void comport_pollintervall(t_comport *x, t_floatarg g);
|
static void comport_pollintervall(t_comport *x, t_floatarg g);
|
||||||
static void comport_tick(t_comport *x);
|
static void comport_tick(t_comport *x);
|
||||||
|
|
@ -240,22 +273,6 @@ void comport_setup(void);
|
||||||
|
|
||||||
/* --------- sys independent serial setup helpers ---------------- */
|
/* --------- sys independent serial setup helpers ---------------- */
|
||||||
|
|
||||||
static long get_baud_ratebits(t_float *baud)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
|
|
||||||
|
|
||||||
/* nearest Baudrate finding */
|
|
||||||
if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0)
|
|
||||||
{
|
|
||||||
post("*Warning* The baud rate %d is not supported or out of range, using 9600\n",*baud);
|
|
||||||
i = 8;
|
|
||||||
}
|
|
||||||
*baud = baudratetable[i];
|
|
||||||
|
|
||||||
return baudspeedbittable[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------ sys dependent serial setup helpers ---------------- */
|
/* ------------ sys dependent serial setup helpers ---------------- */
|
||||||
|
|
@ -267,7 +284,7 @@ static long get_baud_ratebits(t_float *baud)
|
||||||
|
|
||||||
static float set_baudrate(t_comport *x,t_float baud)
|
static float set_baudrate(t_comport *x,t_float baud)
|
||||||
{
|
{
|
||||||
x->dcb.BaudRate = get_baud_ratebits(&baud);
|
x->dcb.BaudRate = (DWORD)baud ;//!!!try directly setting any baud rate...was get_baud_ratebits(&baud);
|
||||||
return baud;
|
return baud;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -373,6 +390,14 @@ static int set_xonxoff(t_comport *x, int nr)
|
||||||
static int set_serial(t_comport *x)
|
static int set_serial(t_comport *x)
|
||||||
{
|
{
|
||||||
if (SetCommState(x->comhandle, &(x->dcb))) return 1;
|
if (SetCommState(x->comhandle, &(x->dcb))) return 1;
|
||||||
|
/* Didn't work. Get the actual state of the device */
|
||||||
|
GetCommState(x->comhandle, &(x->dcb));
|
||||||
|
x->baud = x->dcb.BaudRate;
|
||||||
|
x->data_bits = x->dcb.ByteSize;
|
||||||
|
x->parity_bit = x->dcb.fParity;
|
||||||
|
x->stop_bits = x->dcb.StopBits;
|
||||||
|
x->xonxoff = (x->dcb.fOutX)?1:0;
|
||||||
|
x->ctsrts = (x->dcb.fOutxCtsFlow)?1:0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -582,10 +607,27 @@ int comport_get_cts(t_comport *x)
|
||||||
/* ----------------- POSIX - UNIX ------------------------------ */
|
/* ----------------- POSIX - UNIX ------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
static float set_baudrate(t_comport *x,t_float baud)
|
static long get_baud_ratebits(t_float *baud)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
|
||||||
|
|
||||||
|
/* nearest Baudrate finding */
|
||||||
|
if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0)
|
||||||
|
{
|
||||||
|
post("*Warning* The baud rate %d is not supported or out of range, using 9600\n",*baud);
|
||||||
|
i = 8;
|
||||||
|
}
|
||||||
|
*baud = baudratetable[i];
|
||||||
|
|
||||||
|
return baudspeedbittable[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static float set_baudrate(t_comport *x, t_float baud)
|
||||||
{
|
{
|
||||||
struct termios *tio = &(x->com_termio);
|
struct termios *tio = &(x->com_termio);
|
||||||
long baudbits = get_baud_ratebits(&baud);
|
speed_t baudbits = get_baud_ratebits(&baud);
|
||||||
|
|
||||||
cfsetispeed(tio, baudbits);
|
cfsetispeed(tio, baudbits);
|
||||||
cfsetospeed(tio, baudbits);
|
cfsetospeed(tio, baudbits);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue