outofrangeexception — ошибка std :: out_of_range в коде c ++ с использованием библиотеки libserial

Я немного новичок в C ++. Я использую библиотеку для обработки последовательной связи в среде UNIX, которая называется libserial. Я сделал очень простой тест, чтобы попытаться в библиотеке записать что-то на периферию и получить ответ. Тест прошел довольно хорошо … код показан ниже:

#include <SerialStream.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdlib>

using namespace LibSerial ;int main(int argc, char** argv)
{
SerialStream serial_port;
/*Open the serial port for communication*/
serial_port.Open( "/dev/ttyTHS2" );

/*Setting the baud rate*/
serial_port.SetBaudRate(SerialStreamBuf::BAUD_9600);

/*Setting the character size*/
serial_port.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);

/*Setting number of stop bits*/
serial_port.SetNumOfStopBits(1);

/*Setting parity type*/
serial_port.SetParity(SerialStreamBuf::PARITY_NONE);

/*Setting Flow Control managment*/
serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE) ;

/*WRITTING ROUTINE*/

/*Requesting the TID of the current TAG*/
serial_port.write( "\r", 1);
serial_port.write( "021400", 6);
serial_port.write( "\r", 1);

/*READING RESPONSE FROM PERIPHERAL
const int BUFFER_SIZE = 256;
char input_buffer[BUFFER_SIZE];
serial_port.read(input_buffer, BUFFER_SIZE);
std::string input(input_buffer);
std::string TID = input.substr(5,16);
std::cout << "Current TAG identifier: " << TID << "\n";

/*Closing serial port*/
serial_port.Close();
return 0;

}

Поскольку я хочу выполнить больше, чем операцию записи / чтения … Я решил использовать функции для оптимизации кода и облегчения его изменения. Моя новая оптимизированная версия показана ниже:

#include <SerialStream.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdlib>

using namespace LibSerial ;
using namespace std;

/*Function declaration*/
void serial_setup();
void serial_read();

int main(int argc, char** argv)
{
SerialStream serial_port;
/*SETUP BAUD RATE, PARITY BITS, ETC.
serial_setup();

/*Requesting the TID of the current TAG*/
serial_port.write( "\r", 1);
serial_port.write( "021400", 6);
serial_port.write( "\r", 1);

/*Read response from peripheral
serial_read();

/*Closing serial port*/
serial_port.Close();
return 0;

}

void serial_setup(){
SerialStream serial_port;

/*Open the serial port for communication*/
serial_port.Open( "/dev/ttyTHS2" );

/*Setting the baud rate*/
serial_port.SetBaudRate(SerialStreamBuf::BAUD_9600);

/*Setting the character size*/
serial_port.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);

/*Setting number of stop bits*/
serial_port.SetNumOfStopBits(1);

/*Setting parity type*/
serial_port.SetParity(SerialStreamBuf::PARITY_NONE);

/*Setting Flow Control managment*/
serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE) ;
}

void serial_read(){
SerialStream serial_port;

const int BUFFER_SIZE = 256;
char input_buffer[BUFFER_SIZE];
serial_port.read(input_buffer, BUFFER_SIZE);
string input(input_buffer);
string TID = input.substr(5,16);
cout << "Current TAG identifier: " << TID << "\n";
}

Проблема в том, что каким-то образом, вероятно, существует условие, которое не проверено ни в одной из функций и выдает следующую ошибку при выполнении:

    terminate called after throwing an instance of 'std::out_of_range'
what():  basic_string::substr: __pos (which is 5) > this->size() (which is 3)
Aborted (core dumped)

Я не думаю, что это связано с плохим использованием библиотеки, а не с плохим созданием функции с моей стороны. Я изменил несколько вещей без какой-либо удачи, и это действительно поможет мне, если у вас есть представление о том, где происходит состояние вне диапазона.

0

Решение

main, serial_setup а также serial_read функции работают со своими местными SerialStream переменные, поэтому изменения не сохраняются. Вы должны пройти SerialStream экземпляр из main по ссылке:

void serial_setup(SerialStream & serial_port){

void serial_read(SerialStream & serial_port){

Или на самом деле завернуть SerialStream в объект с serial_setup стать конструктором, serial_read становится методом и serial_port.Close(); становится деструктором.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]