From 916793f77a5e3ab37e3f62a850e0baea3b224900 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Sun, 18 Nov 2012 11:48:26 +0100 Subject: bcm4751_serial_write: Use select before write Signed-off-by: Paul Kocialkowski --- bcm4751_gpsd.c | 23 +++++++++++++++++------ meif.c | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/bcm4751_gpsd.c b/bcm4751_gpsd.c index 690433a..d14667c 100644 --- a/bcm4751_gpsd.c +++ b/bcm4751_gpsd.c @@ -203,9 +203,20 @@ int bcm4751_serial_read(int fd, void *data, int length, struct timeval *timeout) return rc; } -int bcm4751_serial_write(int fd, void *data, int length) +int bcm4751_serial_write(int fd, void *data, int length, struct timeval *timeout) { - return write(fd, data, length); + fd_set fds; + int rc = -1; + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + rc = select(fd + 1, NULL, &fds, NULL, timeout); + if(rc > 0 && length > 0) { + rc = write(fd, data, length); + } + + return rc; } int bcm4751_autobaud(int fd) @@ -223,7 +234,7 @@ int bcm4751_autobaud(int fd) timeout.tv_usec = 0; while(!ready) { - bcm4751_serial_write(fd, autobaud, sizeof(autobaud)); + bcm4751_serial_write(fd, autobaud, sizeof(autobaud), NULL); rc = bcm4751_serial_read(fd, NULL, 0, &timeout); if(rc > 0) @@ -262,9 +273,9 @@ void bcm4751_switch_protocol(int fd) sleep(1); printf("Sending unknown bytes!\n"); - bcm4751_serial_write(fd, data1, sizeof(data1)); - bcm4751_serial_write(fd, data2, sizeof(data2)); - bcm4751_serial_write(fd, data3, sizeof(data3)); + bcm4751_serial_write(fd, data1, sizeof(data1), NULL); + bcm4751_serial_write(fd, data2, sizeof(data2), NULL); + bcm4751_serial_write(fd, data3, sizeof(data3), NULL); bcm4751_read_dump(fd); } diff --git a/meif.c b/meif.c index c72c7db..a4f75de 100644 --- a/meif.c +++ b/meif.c @@ -316,7 +316,7 @@ int meif_message_send(struct meif_message *meif_message, int fd) while(written < length) { count = length - written < chunk ? length - written : chunk; - rc = bcm4751_serial_write(fd, data + written, count); + rc = bcm4751_serial_write(fd, data + written, count, NULL); if(rc <= 0) { printf("Write failed, written %d/%d\n", written, length); free(data); -- cgit v1.2.3