Для изучения я создал упрощенную тестовую программу (не используя Boost.asio), что MIMICS поведение с низкими системами системы Live-Level System. Вот минимальный воспроизводимый пример < /strong>, который повторяет проблему.
Код: Выделить всё
int fd = open(comPort.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
while (true) {
uint8_t byte;
ssize_t n = read(fd, &byte, 1);
if (n > 0) {
SPDLOG_INFO("Read byte: 0x{:02X}", byte);
} else if (n == -1 && errno != EAGAIN) {
SPDLOG_ERROR("Read error: {}", strerror(errno));
break;
} else {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
close(fd);
< /code>
Эта версия работает надежно-все байты принимаются правильно, включая контрольную сумму. < /p>
❌ Проблемная версия (с использованием poll () < /code>): < /h3>
0) {
SPDLOG_INFO("Read byte: 0x{:02X}", byte);
} else if (n == -1 && errno != EAGAIN) {
SPDLOG_ERROR("Read error: {}", strerror(errno));
break;
} else {
pollfd pfd{};
pfd.fd = fd;
pfd.events = POLLIN;
int ret = poll(&pfd, 1, -1);
if (ret == -1) {
SPDLOG_ERROR("poll() error: {}", strerror(errno));
break;
}
// No delay here
}
}
close(fd);
Код: Выделить всё
// Inside the poll() block
std::this_thread::sleep_for(std::chrono::microseconds(1));
Должен ли я всегда добавлять короткую задержку после опроса () < /code>? Или есть более надежный подход - особенно при использовании boost.asio?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... 0x00-inste