Для изучения я создал упрощенную тестовую программу (не используя 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;
} else if (ret > 0 && (pfd.revents & POLLIN) == 0) {
SPDLOG_ERROR("revents[{}] != POLLIN[{}]", pfd.revents, POLLIN);
break;
}
// No delay here
}
}
close(fd);
Код: Выделить всё
// Inside the poll() block
std::this_thread::sleep_for(std::chrono::microseconds(1));
Код: Выделить всё
asio::io_context ioContext;
asio::serial_port serial(ioContext);
serial.open(comPort);
serial.set_option(asio::serial_port_base::baud_rate(1200));
serial.set_option(asio::serial_port_base::character_size(8));
serial.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::odd));
serial.set_option(asio::serial_port_base::flow_control(asio::serial_port_base::flow_control::none));
serial.set_option(asio::serial_port_base::stop_bits(asio::serial_port_base::stop_bits::one));
uint8_t byte;
asio::error_code ec;
while (true) {
size_t len = asio::read(serial, asio::buffer(&byte, 1), ec);
if (ec) {
SPDLOG_ERROR("Error reading from serial port: {}", ec.message());
break;
}
SPDLOG_INFO("Read byte: 0x{:02X}", byte);
}
serial.close();
< /code>
🔍 Мои вопросы < /h2>
[b] Почему это происходит? /> это известная проблема или условие гонки [/b] при использовании olp ()
Подробнее здесь: https://stackoverflow.com/questions/795 ... 0x00-inste