Необходимо реализовать простую программу передачи данных по компорту. Устройство которое кидает мне пакет в ответ который я должен прочитать делает это только в ассинхронном режиме. Я пользуюсь бустом и ниже приведу кусок кода:
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. С Чем может быть это связанно?
Глобальные переменные io_service io; serial_port port(io);
чреваты SIOF / SUOF. Конкретно в этом примере это вряд ли что-то меняет, но тем не менее.
В таком виде это не может компилироваться, так как в функции getAnsw
переменная bufferPack
не объявлена. (далее предполагаю, что это переменная из basicF
)
Ключевое слово - ассинхронный. При вызове port.async_read_some(buffer(bufferPack,1),handler);
функция обратного вызова никогда не вызывается, даже если операция завершилась сразу. Эта функция только инициализирует асинхронную операцию.
Буфер, в который производится асинхронное чтение, должен оставаться валидным до завершения асинхронной операции. А тут он сразу выходит из области видимости. Соответственно выделяйте буфер динамически и удаляйте строго после вызова функции обратного вызова.
Теперь собственно как заставить вызоваться handler
. Для этого надо тыркнуть объект io_service
, ассоциированный с портом. Например вызвав
// не блокирует, надо периодически повторять, пока не вызовется обработчик
auto invoked_handlers_count{io.poll_one()};
или
// блокирует пока не вызовется обработчик
auto invoked_handlers_count{io.run_one()};
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне надо каждому QList ImageList; присвоить определённый индекс
Поднимаясь по лестнице, заяц прыгает либо на следующую ступеньку, либо через одну, либо через двеСколькими способами он может поднятся на ступеньку...