Attempt to make reception more efficient in linux by reading the number of bytes actually available instead of one at a time. Added an rxerrors output for the info message. First 10 rxerrors print to console with errno/LastError.
svn path=/trunk/externals/iem/comport/; revision=13118
This commit is contained in:
parent
ebc39b9349
commit
6fa08ba7a3
2 changed files with 74 additions and 65 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
#N canvas 249 252 1031 627 10;
|
#N canvas 157 178 1031 627 10;
|
||||||
#X obj 488 438 comport 1 9600;
|
#X obj 488 438 comport 1 9600;
|
||||||
#X msg 276 421 66;
|
#X msg 276 421 66;
|
||||||
#X msg 234 421 64;
|
#X msg 234 421 64;
|
||||||
|
|
@ -48,10 +48,10 @@ maybe if suid is root damage the system.;
|
||||||
#X text 560 206 set poll interval for read in ms;
|
#X text 560 206 set poll interval for read in ms;
|
||||||
#X msg 321 254 info;
|
#X msg 321 254 info;
|
||||||
#X floatatom 569 497 10 0 0 1 baud - -;
|
#X floatatom 569 497 10 0 0 1 baud - -;
|
||||||
#X floatatom 650 538 3 0 0 3 parity - -;
|
#X floatatom 644 538 3 0 0 3 parity - -;
|
||||||
#X floatatom 678 538 3 0 0 2 stop - -;
|
#X floatatom 669 538 3 0 0 2 stop - -;
|
||||||
#X floatatom 705 537 3 0 0 3 data - -;
|
#X floatatom 694 537 3 0 0 3 data - -;
|
||||||
#X floatatom 787 499 3 0 0 0 port - -;
|
#X floatatom 770 499 3 0 0 0 port - -;
|
||||||
#X msg 544 291 devices;
|
#X msg 544 291 devices;
|
||||||
#X obj 141 74 % 255;
|
#X obj 141 74 % 255;
|
||||||
#X floatatom 179 91 5 0 0 0 - - -;
|
#X floatatom 179 91 5 0 0 0 - - -;
|
||||||
|
|
@ -60,16 +60,16 @@ maybe if suid is root damage the system.;
|
||||||
#X obj 170 130 sel 0;
|
#X obj 170 130 sel 0;
|
||||||
#X floatatom 249 147 4 0 0 0 ascii - -;
|
#X floatatom 249 147 4 0 0 0 ascii - -;
|
||||||
#X msg 524 271 open 0;
|
#X msg 524 271 open 0;
|
||||||
#X obj 732 503 tgl 15 0 empty empty rts/cts -10 20 1 11 -24198 -258699
|
#X obj 719 503 tgl 15 0 empty empty rts/cts -10 20 1 11 -24198 -258699
|
||||||
-1 0 1;
|
-1 0 1;
|
||||||
#X obj 759 529 tgl 15 0 empty empty xon/xoff -14 20 1 11 -24198 -258699
|
#X obj 745 519 tgl 15 0 empty empty xon/xoff -14 20 1 11 -24198 -258699
|
||||||
-1 0 1;
|
-1 0 1;
|
||||||
#X text 508 537 serial packet format:;
|
#X text 508 537 serial packet format:;
|
||||||
#X text 658 500 handshaking:;
|
#X text 660 487 handshaking:;
|
||||||
#X text 468 569 flow control inputs:;
|
#X text 466 569 flow control inputs:;
|
||||||
#X obj 596 569 tgl 15 0 empty empty dsr 0 20 1 11 -24198 -258699 -1
|
#X obj 594 569 tgl 15 0 empty empty dsr 0 20 1 11 -24198 -258699 -1
|
||||||
0 1;
|
0 1;
|
||||||
#X obj 623 569 tgl 15 0 empty empty cts 0 20 1 11 -24198 -258699 -1
|
#X obj 619 569 tgl 15 0 empty empty cts 0 20 1 11 -24198 -258699 -1
|
||||||
0 1;
|
0 1;
|
||||||
#N canvas 307 43 789 479 bauds 0;
|
#N canvas 307 43 789 479 bauds 0;
|
||||||
#X msg 319 274 baud 57600;
|
#X msg 319 274 baud 57600;
|
||||||
|
|
@ -146,10 +146,10 @@ maybe if suid is root damage the system.;
|
||||||
-1 0 1;
|
-1 0 1;
|
||||||
#X text 17 -4 comport: a serial port interface;
|
#X text 17 -4 comport: a serial port interface;
|
||||||
#X msg 243 176 13;
|
#X msg 243 176 13;
|
||||||
#X obj 814 498 tgl 15 0 empty empty open -6 20 1 11 -24198 -258699
|
#X obj 795 500 tgl 15 0 empty empty open -6 20 1 11 -24198 -258699
|
||||||
-1 0 1;
|
-1 1 1;
|
||||||
#X msg 565 312 ports;
|
#X msg 565 312 ports;
|
||||||
#X obj 841 531 print port_list;
|
#X obj 820 534 print port_list;
|
||||||
#X text 611 311 list available ports on right outlet;
|
#X text 611 311 list available ports on right outlet;
|
||||||
#X msg 275 208 48 49 50 51 52 53 54 55 56 57;
|
#X msg 275 208 48 49 50 51 52 53 54 55 56 57;
|
||||||
#X text 137 207 send a list of bytes:;
|
#X text 137 207 send a list of bytes:;
|
||||||
|
|
@ -160,15 +160,12 @@ maybe if suid is root damage the system.;
|
||||||
-1 0 1;
|
-1 0 1;
|
||||||
#X text 704 386 hang up connection on last close;
|
#X text 704 386 hang up connection on last close;
|
||||||
#X text 717 398 (not on Windows);
|
#X text 717 398 (not on Windows);
|
||||||
#X obj 910 490 print other;
|
#X obj 934 490 print other;
|
||||||
#X text 37 526 2006-2008 Martin Peach;
|
|
||||||
#X text 205 176 <CR>:;
|
#X text 205 176 <CR>:;
|
||||||
#X text 143 254 status list on right outlet:;
|
#X text 143 254 status list on right outlet:;
|
||||||
#X text 257 300 print usage info:;
|
#X text 257 300 print usage info:;
|
||||||
#X obj 569 460 route baud dsr cts parity stop data rtscts xonxoff port
|
#X obj 845 497 tgl 15 0 empty empty hupcl -6 20 1 11 -24198 -258699
|
||||||
open ports hupcl;
|
-1 1 1;
|
||||||
#X obj 868 497 tgl 15 0 empty empty hupcl -6 20 1 11 -24198 -258699
|
|
||||||
-1 0 1;
|
|
||||||
#X msg 452 110 1;
|
#X msg 452 110 1;
|
||||||
#X msg 482 110 1.5;
|
#X msg 482 110 1.5;
|
||||||
#X msg 513 110 2;
|
#X msg 513 110 2;
|
||||||
|
|
@ -178,7 +175,11 @@ open ports hupcl;
|
||||||
#X text 16 30 You can send bytes directly (0-255):;
|
#X text 16 30 You can send bytes directly (0-255):;
|
||||||
#X text 12 112 or from the terminal:;
|
#X text 12 112 or from the terminal:;
|
||||||
#X text 56 420 messages for the bird patch:;
|
#X text 56 420 messages for the bird patch:;
|
||||||
#X connect 0 1 86 0;
|
#X floatatom 870 510 10 0 0 1 rxerrors - -;
|
||||||
|
#X obj 569 460 route baud dsr cts parity stop data rtscts xonxoff port
|
||||||
|
open ports hupcl rxerrors;
|
||||||
|
#X text 37 526 2006-2010 Martin Peach;
|
||||||
|
#X connect 0 1 96 0;
|
||||||
#X connect 1 0 0 0;
|
#X connect 1 0 0 0;
|
||||||
#X connect 2 0 0 0;
|
#X connect 2 0 0 0;
|
||||||
#X connect 5 0 0 0;
|
#X connect 5 0 0 0;
|
||||||
|
|
@ -218,20 +219,21 @@ open ports hupcl;
|
||||||
#X connect 75 0 0 0;
|
#X connect 75 0 0 0;
|
||||||
#X connect 77 0 17 0;
|
#X connect 77 0 17 0;
|
||||||
#X connect 78 0 77 0;
|
#X connect 78 0 77 0;
|
||||||
#X connect 86 0 42 0;
|
#X connect 86 0 90 0;
|
||||||
#X connect 86 1 60 0;
|
#X connect 87 0 90 0;
|
||||||
#X connect 86 2 61 0;
|
#X connect 88 0 90 0;
|
||||||
#X connect 86 3 43 0;
|
#X connect 90 0 17 0;
|
||||||
#X connect 86 4 44 0;
|
#X connect 96 0 42 0;
|
||||||
#X connect 86 5 45 0;
|
#X connect 96 1 60 0;
|
||||||
#X connect 86 6 55 0;
|
#X connect 96 2 61 0;
|
||||||
#X connect 86 7 56 0;
|
#X connect 96 3 43 0;
|
||||||
#X connect 86 8 46 0;
|
#X connect 96 4 44 0;
|
||||||
#X connect 86 9 69 0;
|
#X connect 96 5 45 0;
|
||||||
#X connect 86 10 71 0;
|
#X connect 96 6 55 0;
|
||||||
#X connect 86 11 87 0;
|
#X connect 96 7 56 0;
|
||||||
#X connect 86 12 81 0;
|
#X connect 96 8 46 0;
|
||||||
#X connect 88 0 92 0;
|
#X connect 96 9 69 0;
|
||||||
#X connect 89 0 92 0;
|
#X connect 96 10 71 0;
|
||||||
#X connect 90 0 92 0;
|
#X connect 96 11 85 0;
|
||||||
#X connect 92 0 17 0;
|
#X connect 96 12 95 0;
|
||||||
|
#X connect 96 13 81 0;
|
||||||
|
|
|
||||||
|
|
@ -277,6 +277,7 @@ static void comport_output_data_bits(t_comport *x);
|
||||||
static void comport_output_rtscts(t_comport *x);
|
static void comport_output_rtscts(t_comport *x);
|
||||||
static void comport_output_xonxoff(t_comport *x);
|
static void comport_output_xonxoff(t_comport *x);
|
||||||
static void comport_output_hupcl(t_comport *x);
|
static void comport_output_hupcl(t_comport *x);
|
||||||
|
static void comport_output_rxerrors(t_comport *x);
|
||||||
static void comport_enum(t_comport *x);
|
static void comport_enum(t_comport *x);
|
||||||
static void comport_info(t_comport *x);
|
static void comport_info(t_comport *x);
|
||||||
static void comport_devices(t_comport *x);
|
static void comport_devices(t_comport *x);
|
||||||
|
|
@ -1096,15 +1097,14 @@ static void comport_tick(t_comport *x)
|
||||||
|
|
||||||
x->x_hit = 0;
|
x->x_hit = 0;
|
||||||
|
|
||||||
if(fd == INVALID_HANDLE_VALUE) return;
|
if(fd != INVALID_HANDLE_VALUE)
|
||||||
|
{ /* while there are bytes, read them and send them out, ignore errors (!??) */
|
||||||
/* while there are bytes, read them and send them out, ignore errors */
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
{
|
|
||||||
unsigned char serial_byte[1000];
|
unsigned char serial_byte[1000];
|
||||||
DWORD dwRead;
|
DWORD dwRead;
|
||||||
OVERLAPPED osReader = {0};
|
OVERLAPPED osReader = {0};
|
||||||
DWORD dwX;
|
DWORD dwX;
|
||||||
|
DWORD whicherr = 0;
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
||||||
|
|
@ -1122,38 +1122,39 @@ static void comport_tick(t_comport *x)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
err = -1;
|
err = -1;
|
||||||
|
whicherr = GetLastError();
|
||||||
}
|
}
|
||||||
CloseHandle(osReader.hEvent);
|
CloseHandle(osReader.hEvent);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
{
|
unsigned char serial_byte[1000];
|
||||||
unsigned char serial_byte;
|
|
||||||
fd_set com_rfds;
|
fd_set com_rfds;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
int i;
|
||||||
|
int whicherr = 0;
|
||||||
|
|
||||||
FD_ZERO(&com_rfds);
|
FD_ZERO(&com_rfds);
|
||||||
FD_SET(fd,&com_rfds);
|
FD_SET(fd,&com_rfds);
|
||||||
|
|
||||||
while((err=select(fd+1,&com_rfds,NULL,NULL,&null_tv)) > 0)
|
while((err=select(fd+1,&com_rfds,NULL,NULL,&null_tv)) > 0)
|
||||||
{
|
{
|
||||||
err = read(fd,(char *) &serial_byte,1);
|
ioctl(fd, FIONREAD, &count); /* load count with the number of bytes in the receive buffer */
|
||||||
/* while( (err = read(fd,(char *) &serial_byte,1)) > 0){ */
|
/*err = read(fd,(char *) &serial_byte,1);*/
|
||||||
outlet_float(x->x_data_outlet, (t_float) serial_byte);
|
err = read(fd,(char *) &serial_byte, count);/* try to read count bytes */
|
||||||
++count;
|
if (err >= 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < err; ++i ) outlet_float(x->x_data_outlet, (t_float) serial_byte);
|
||||||
}
|
}
|
||||||
// if( count > 0)
|
else whicherr = errno;
|
||||||
// post("--- %d", count);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
if(err < 0)
|
if(err < 0)
|
||||||
{ /* if a read error detected */
|
{ /* if a read error detected */
|
||||||
if(x->rxerrors == 0) /* post it once */
|
if(x->rxerrors < 10) /* ten times max */
|
||||||
post("RXERRORS on serial line\n");
|
post("RXERRORS on serial line (%d)\n", whicherr);
|
||||||
x->rxerrors = 1; /* remember */
|
x->rxerrors++; /* remember */
|
||||||
}
|
}
|
||||||
if (!x->x_hit) clock_delay(x->x_clock, 1);
|
if (!x->x_hit) clock_delay(x->x_clock, 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void comport_float(t_comport *x, t_float f)
|
static void comport_float(t_comport *x, t_float f)
|
||||||
{
|
{
|
||||||
|
|
@ -1764,6 +1765,11 @@ static void comport_output_hupcl(t_comport *x)
|
||||||
comport_output_status(x, gensym("hupcl"), x->hupcl);
|
comport_output_status(x, gensym("hupcl"), x->hupcl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void comport_output_rxerrors(t_comport *x)
|
||||||
|
{
|
||||||
|
comport_output_status(x, gensym("rxerrors"), x->rxerrors);
|
||||||
|
}
|
||||||
|
|
||||||
static void comport_output_open_status(t_comport *x)
|
static void comport_output_open_status(t_comport *x)
|
||||||
{
|
{
|
||||||
if(x->comhandle == INVALID_HANDLE_VALUE)
|
if(x->comhandle == INVALID_HANDLE_VALUE)
|
||||||
|
|
@ -1790,6 +1796,7 @@ static void comport_info(t_comport *x)
|
||||||
comport_output_rtscts(x);
|
comport_output_rtscts(x);
|
||||||
comport_output_xonxoff(x);
|
comport_output_xonxoff(x);
|
||||||
comport_output_hupcl(x);
|
comport_output_hupcl(x);
|
||||||
|
comport_output_rxerrors(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------- HELPER ------------------------- */
|
/* ---------------- HELPER ------------------------- */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue