Я использую функцию boost :: asio :: async_read_until для чтения с последовательного порта в Windows 10. Разделителем является шаблон Regex. Он работает, как и ожидалось, если полученные данные не превышают 512 байт.
Если полученные данные превышают 512 байт, они просто усекаются, и функция readComplete больше не будет вызываться. Однако, если я отправлю больше данных, достаточно 1 байта, отсутствующие данные будут получены вместе с новыми данными.
Я использовал ту же реализацию для tcp / сокета, и она работает безупречно. Есть ли какие-либо ограничения в собственном последовательном интерфейсе в Windows, вызывающие такое поведение?
РЕДАКТИРОВАТЬ 1: Я заметил, что если скорость передачи данных снижается с 115200 до 28800, никакие данные отсутствуют.
// from .h-file: boost::asio::streambuf streamBuf_;
void RS232Instrument::readAsyncChars()
{
boost::asio::async_read_until(
serial_,
streamBuf_,
boost::regex(regexStr_.substr(6, regexStr_.length() - 7)),
boost::bind(
&RS232Instrument::readComplete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void RS232Instrument::readComplete(const boost::system::error_code& error, size_t bytes_transferred)
{
if(error)
{
// Error handling
}
else
{
std::string rawStr(
boost::asio::buffers_begin(streamBuf_.data()),
boost::asio::buffers_begin(streamBuf_.data()) + bytes_transferred);
// Log the data in rawStr....
// Remove data from beginning until all data sent to log
streamBuf_.consume(bytes_transferred);
if(abort_ == false)
{
readAsyncChars();
}
}
}