Я пытаюсь сгенерировать класс для чтения с определенного последовательного устройства.
Для запуска процесса необходимо отправить символ '1', затем я должен ждать ответа (254 и255).
В течение 10 миллисекунд я должен отправить следующую команду устройству, но на этот раз длина команды составляет 5 символов.
Когда сообщение не было отправленоправильное время, устройство будет работать в тайм-аут и отправляет мне 255,255,255,2,4.
Так что мне нужны разные размеры чтения, и наиболее важным для меня является тайм-аут для связи, иначесистема перестанет работать, пропустив некоторые значения.
Поэтому я попытался сгенерировать класс, используя boost :: asio :: async_read.
Он работает правильно, я могу определитьвремя ожидания, а также размер байтов для чтения. Когда устройство не отправляет правильный размер, процедура будет оставлена.
Но только в первый раз, когда я попробую это второй раз, устройство не отправляет мне что-то. Я попытался использовать .open снова, но это не решает проблему. Кроме того, деактивация функции close не решает проблему, а затем в программе возникает ошибка.
Может кто-нибудь дать мне небольшой совет по моей проблеме. Может быть, я слепой, чтобы увидеть мою проблему ... Бернд
ConnectionWithTimeout::ConnectionWithTimeout(int timeout_)
: timer_(io_service_, boost::posix_time::milliseconds(timeout_))
, serial_port_(io_service_) {
}
void ConnectionWithTimeout::ReadNumberOfChars(int numberOfCharactersToRead_)
{
buffer_.resize(numberOfCharactersToRead_);
for (int i = 0; i < numberOfCharactersToRead_; ++i) {
std::cout << "Clear Buffer[" << i << "]" << std::endl;
buffer_[i] = 0;
}
timer_.async_wait(boost::bind(&::ConnectionWithTimeout::Stop, this));
//async read from serial port
boost::asio::async_read(serial_port_, boost::asio::buffer(buffer_),
boost::bind(&ConnectionWithTimeout::ReadHandle, this,
boost::asio::placeholders::error));
io_service_.run();
}
void ConnectionWithTimeout::Stop() {
std::cout << "Connection is being closed." << std::endl;
serial_port_.close();
std::cout << "Connection has been closed." << std::endl;
}
void ConnectionWithTimeout::ReadHandle(const boost::system::error_code& ec) {
if (ec) {
std::cout << "The amount of data is to low: " << ec << std::endl;
for (std::vector<char>::iterator it = buffer_.begin();
it != buffer_.end(); ++it)
{
std::cout << int(*it) << std::endl;
}
}
else {
std::cout << "The amount of data is correct: " << ec << std::endl;
for (std::vector<char>::iterator it = buffer_.begin(); it !=
buffer_.end(); ++it)
{
std::cout << int(*it) << std::endl;
}
}
}