int serialReadChunk ( SerialDevice *serial, void *buffer, size_t *offset, size_t count, int initialTimeout, int subsequentTimeout ) { unsigned char *byte = buffer; const unsigned char *const first = byte; const unsigned char *const end = first + count; int timeout = *offset? subsequentTimeout: initialTimeout; if (!serialFlushAttributes(serial)) return 0; byte += *offset; while (byte < end) { ssize_t result = serialGetData(serial, byte, 1, timeout, subsequentTimeout); if (!result) { result = -1; errno = EAGAIN; } if (result == -1) { if (errno == EINTR) continue; return 0; } byte += 1; *offset += 1; timeout = subsequentTimeout; } return 1; }
ssize_t serialReadData ( SerialDevice *serial, void *buffer, size_t size, int initialTimeout, int subsequentTimeout ) { if (!serialFlushAttributes(serial)) return -1; return serialGetData(serial, buffer, size, initialTimeout, subsequentTimeout); }
uint8_t *serialCommand(void *driverVoid, uint16_t transactions, uint32_t *buffer) { driver_t *driver = (driver_t *)driverVoid; serial_port_t *port = (serial_port_t *)driver->driverContext; uint8_t *returnBuffer = (uint8_t *)malloc(transactions); if (returnBuffer == NULL) { return NULL; } // Send the transaction data to the serial port serialPutData(port, transactions * 4, (uint8_t *)buffer); serialGetData(port, transactions, returnBuffer); return returnBuffer; }