summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bcm4751_gpsd.c23
-rw-r--r--meif.c2
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);