Попытка сгенерировать синхронизированное соединение для последовательного устройства ttys0 в unix-системе. - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь сгенерировать класс для чтения с определенного последовательного устройства.

Для запуска процесса необходимо отправить символ '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;
         }
    }
}
...