Boost async_read_some serial port

110
01 сентября 2019, 05:00

Необходимо реализовать простую программу передачи данных по компорту. Устройство которое кидает мне пакет в ответ который я должен прочитать делает это только в ассинхронном режиме. Я пользуюсь бустом и ниже приведу кусок кода:

using namespace boost::asio;
io_service io;
serial_port port(io);

void handler( const boost::system::error_code& error,
              std::size_t bytes_transferred)
{
    if (!error)
    {
        std::cout << "all ok" <<std::endl;
        std::cout << "byteSize" << bytes_transferred << std::endl;
    }
    else
    {
        std::cerr<<"error: "<< error <<std::endl;
    }
}
void getAnsw()
{
    port.async_read_some(buffer(bufferPack,1),handler);
}
void basicF(uint8_t comand)
{
switch(comand)
{
case 0x24:
{
    read_values_DAC_master *pack = make_read_values_DAC_master(0,21,2,0,1);
    int sizeOfPack = 13 + (int)pack->header.sizeData + 2;
    unsigned char bufferPack[sizeOfPack];
    memcpy(&bufferPack,pack,sizeOfPack);
    port.write_some(buffer(bufferPack,sizeOfPack));
    getAnsw();
    delete pack;
    break;
}
}
}

int main()
{
    port.open(NUMBER_PORT);
    port.set_option(serial_port_base::baud_rate(115200));
    port.set_option(serial_port_base::character_size(8));
    port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
    port.set_option(serial_port_base::parity(serial_port_base::parity::none));
    port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::hardware));
    while (stop == true)
    {
        std::cout << "Press Number: \n1 - 0x24 Read values D \n0 - for exit!"<<std::endl;
        int code = 22;
        std::cout << "EDIT: ";
        std::cin>>code;
        switch (code) {
        case 0:
            return 0;
        case 1:
            basicF(0x24);
            break;
        default:
            std::cout<< "no such command!"<<std::endl;
            break;
        }
    }
}

где handler это функция

void handler( const boost::system::error_code& error,
              std::size_t bytes_transferred)
{
    if (!error)
    {
        std::cout << "all ok" <<std::endl;
        std::cout << "byteSize" << bytes_transferred << std::endl;
    }
    else
    {
        std::cerr<<"error: "<< error <<std::endl;
    }
}

Но мой код не разу не вызывает этот handler. С Чем может быть это связанно?

Answer 1
  1. Глобальные переменные io_service io; serial_port port(io); чреваты SIOF / SUOF. Конкретно в этом примере это вряд ли что-то меняет, но тем не менее.

  2. В таком виде это не может компилироваться, так как в функции getAnsw переменная bufferPack не объявлена. (далее предполагаю, что это переменная из basicF)

  3. Ключевое слово - ассинхронный. При вызове port.async_read_some(buffer(bufferPack,1),handler); функция обратного вызова никогда не вызывается, даже если операция завершилась сразу. Эта функция только инициализирует асинхронную операцию.

  4. Буфер, в который производится асинхронное чтение, должен оставаться валидным до завершения асинхронной операции. А тут он сразу выходит из области видимости. Соответственно выделяйте буфер динамически и удаляйте строго после вызова функции обратного вызова.

  5. Теперь собственно как заставить вызоваться handler. Для этого надо тыркнуть объект io_service, ассоциированный с портом. Например вызвав

// не блокирует, надо периодически повторять, пока не вызовется обработчик
auto invoked_handlers_count{io.poll_one()};

или

// блокирует пока не вызовется обработчик
auto invoked_handlers_count{io.run_one()};
READ ALSO
Перевести строки из текстового файла в QML TableView

Перевести строки из текстового файла в QML TableView

Есть содержимое текстового файла:

135
Как создать QList &lt;QList &lt;QImage&gt;&gt; SourceImageList; в котором каждый QList &lt;QImage&gt; был бы с определённым индексом?

Как создать QList <QList <QImage>> SourceImageList; в котором каждый QList <QImage> был бы с определённым индексом?

Мне надо каждому QList ImageList; присвоить определённый индекс

143
Оптимизация и статические функции

Оптимизация и статические функции

Вопрос навеян следующим утверждением:

132
Как оптимизировать рекурсию?

Как оптимизировать рекурсию?

Поднимаясь по лестнице, заяц прыгает либо на следующую ступеньку, либо через одну, либо через двеСколькими способами он может поднятся на ступеньку...

124