/** * Drain serial port buffers. * * @param serial Previously initialized serial port structure. * * @retval SR_OK Success. * @retval SR_ERR Failure. * * @private */ SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial) { int ret; char *error; if (!serial) { sr_dbg("Invalid serial port."); return SR_ERR; } if (!serial->data) { sr_dbg("Cannot drain unopened serial port %s.", serial->port); return SR_ERR; } sr_spew("Draining serial port %s.", serial->port); ret = sp_drain(serial->data); if (ret == SP_ERR_FAIL) { error = sp_last_error_message(); sr_err("Error draining port (%d): %s.", sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } return SR_OK; }
int navilink_write_device(NavilinkDevice* device, uint8_t packet_type, const uint8_t* payload, size_t payload_length) { assert(device != NULL); uint8_t* buff = (void*)(&device->buffer[0]); memset(buff, 0, NAVILINK_MAX_PACKET_SIZE); int bytes = navilink_create_packet(buff, packet_type, payload, payload_length); if (bytes < 0) { navilink_set_current_error(device, bytes, NULL); return -1; } #if (__DEBUG_CMD) printf("WRITE:"); DumpHex(buff, bytes); #endif enum sp_return result = sp_blocking_write(device->serial_port, &device->buffer[0], bytes, 1000); if (result < 0) { goto manage_serial_error; } result = sp_drain(device->serial_port); if (result < 0) { goto manage_serial_error; } return 0; manage_serial_error: CATCH_LIBSERIAL_ERROR(device); return -1; }
uart_input::~uart_input() { std::array<std::uint8_t, 31> buffer = { 0 }; sp_blocking_write(port, (void*)buffer.data(), buffer.size(), 0); sp_drain(port); sp_close(port); sp_free_port(port); }