Boost Asio för seriell kommunikation - Kan man optimera detta kodexempel? C++
Jag använder Boost Asio för att kommunicera via USB uttaget. Orsaken varför jag använder Boost Asio har med att libusb kan inte enumerera korrekt port t.ex. COM1, COM2, COM3. Istället får man VendorID. Exempel: https://stackoverflow.com/questions/14722083/how-to-use-libus...
Som jag uppfattar detta så använder Boost Asio själva operativsystemets egna USB-bibliotek för att kommunicera. Medan libusb kommunicerar direkt till hårdvaran, därav snabbare, men man får inte med alla fina saker som Boost Asio erbjuder t.ex. buffer och enummerering av enheter.
Det jag har gjort är att jag har skrivit en läsfunktion och en skrivfunktion. Det jag tänkte fråga er är om det finns potential att kunna optimera denna kod? Så vad tror ni? Går det göra koden snabbare igenom att slippa använda trådar? Koden är klippt från en .cpp fil, därav försvann åäö.
Skrivfunktion:
static boost::asio::io_context io;
static std::map<std::string, std::shared_ptr<boost::asio::serial_port>> devicesCDC;
static bool existerarPorten(const char port[]) {
return devicesCDC.find(port) != devicesCDC.end() ? true : false;
}
int32_t write(const char port[], const uint8_t data[], const uint16_t size, const int32_t timeout_ms) {
int32_t writtenBytes = 0;
if (existerarPorten(port)) {
// Get the USB
auto deviceUSB = devicesCDC.at(port);
// Skapa en io_context och deadline_timer
boost::asio::io_context io;
boost::asio::deadline_timer timer(io);
boost::system::error_code ec;
// Starta deadline timer
timer.expires_from_now(boost::posix_time::milliseconds(timeout_ms));
timer.async_wait([&](const boost::system::error_code& error) {
if (!error) {
// Om timeout intr ffar, st ng seriellporten
ec = boost::asio::error::operation_aborted;
deviceUSB->cancel();
}
});
// Starta en separat tr d f r att k ra io_context
std::thread io_thread([&]() { io.run(); });
// Utför skrivoperationen
writtenBytes = boost::asio::write(*deviceUSB, boost::asio::buffer(data, size), ec);
// Avbryt timern och v nta p io_context-tr den
timer.cancel();
if (io_thread.joinable()) {
io_thread.join();
}
// Kontrollera fel
if (ec) {
if (ec == boost::asio::error::operation_aborted) {
std::cerr << "CDC.cpp: Timeout intr ffade under skrivning till port: " << port << std::endl;
return -1; // Returnera felkod f r timeout
}
std::cerr << "CDC.cpp: Fel vid skrivning: " << ec.message() << std::endl;
return -1;
}
}
return writtenBytes;
}
Läsfunktion:
int32_t read(const char port[], uint8_t data[], const uint16_t size, const int32_t timeout_ms) {
int32_t bytesRead = 0;
if (existerarPorten(port)) {
// Get the USB
auto deviceUSB = devicesCDC.at(port);
// Skapa en io_context och deadline_timer
boost::asio::io_context io;
boost::asio::deadline_timer timer(io);
boost::system::error_code ec;
// Starta deadline timer
timer.expires_from_now(boost::posix_time::milliseconds(timeout_ms));
timer.async_wait([&](const boost::system::error_code& error) {
if (!error) {
// Om timeout intr ffar, st ng seriellporten
ec = boost::asio::error::operation_aborted;
deviceUSB->cancel();
}
});
// Starta en separat tr d f r att k ra io_context
std::thread io_thread([&]() { io.run(); });
// Utför operationen
bytesRead = boost::asio::read(*deviceUSB, boost::asio::buffer(data, size), ec);
// Avbryt timern och v nta p io_context-tr den
timer.cancel();
if (io_thread.joinable()) {
io_thread.join();
}
// Kontrollera fel
if (ec) {
if (ec == boost::asio::error::operation_aborted) {
std::cerr << "CDC.cpp: Timeout intr ffade under l sning fr n port: " << port << std::endl;
return -1; // Returnera felkod f r timeout
}
std::cerr << "CDC.cpp: Fel vid l sning: " << ec.message() << std::endl;
return -1;
}
}
return bytesRead;
}