kopia lustrzana https://github.com/Hamlib/Hamlib
added fread_block for file buffered access
git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@197 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.1.0
rodzic
566ad55505
commit
e61e1fb8e8
66
src/serial.c
66
src/serial.c
|
@ -6,7 +6,7 @@
|
||||||
* Provides useful routines for read/write serial data for communicating
|
* Provides useful routines for read/write serial data for communicating
|
||||||
* via serial interface.
|
* via serial interface.
|
||||||
*
|
*
|
||||||
* $Id: serial.c,v 1.1 2000-10-01 14:24:47 f4cfe Exp $
|
* $Id: serial.c,v 1.2 2000-10-08 21:46:09 f4cfe Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#include <rig.h>
|
#include <hamlib/rig.h>
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
|
@ -405,3 +405,65 @@ int read_block(int fd, unsigned char *rxbuffer, size_t count, int timeout )
|
||||||
return total_count; /* return bytes count read */
|
return total_count; /* return bytes count read */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fread_block(FILE *stream, unsigned char *rxbuffer, size_t count, int timeout )
|
||||||
|
{
|
||||||
|
fd_set rfds;
|
||||||
|
struct timeval tv, tv_timeout;
|
||||||
|
int rd_count, total_count = 0;
|
||||||
|
int retval;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = fileno(stream);
|
||||||
|
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
FD_SET(fd, &rfds);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait up to timeout ms.
|
||||||
|
*/
|
||||||
|
tv_timeout.tv_sec = timeout/1000;
|
||||||
|
tv_timeout.tv_usec = (timeout%1000)*1000;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* grab bytes from the rig
|
||||||
|
* The file descriptor must have been set up non blocking.
|
||||||
|
*/
|
||||||
|
rd_count = fread(rxbuffer, 1, count, stream);
|
||||||
|
if (rd_count < 0) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "read_block: read failed - %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return -RIG_EIO;
|
||||||
|
}
|
||||||
|
total_count += rd_count;
|
||||||
|
count -= rd_count;
|
||||||
|
|
||||||
|
while (count > 0) {
|
||||||
|
tv = tv_timeout; /* select may have updated it */
|
||||||
|
|
||||||
|
retval = select(fd+1, &rfds, NULL, NULL, &tv);
|
||||||
|
if (!retval) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"rig timeout after %d chars or select error - %s!\n",
|
||||||
|
total_count, strerror(errno));
|
||||||
|
return -RIG_ETIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* grab bytes from the rig
|
||||||
|
* The file descriptor must have been set up non blocking.
|
||||||
|
*/
|
||||||
|
rd_count = fread(rxbuffer+total_count, 1, count, stream);
|
||||||
|
if (rd_count < 0) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "read_block: read failed - %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return -RIG_EIO;
|
||||||
|
}
|
||||||
|
total_count += rd_count;
|
||||||
|
count -= rd_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_TRACE,"RX %d bytes\n",total_count);
|
||||||
|
dump_hex(rxbuffer, total_count);
|
||||||
|
return total_count; /* return bytes count read */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue