私はC ++が初めてです。libserialというUNIX環境でシリアル通信を扱うライブラリを使っています。ライブラリがペリフェラルに何かを書き込んで応答を受け取るようにするための非常に簡単なテストを行いました。テストはかなりうまくいきました...コードを以下に示します:
#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";
}
問題は、おそらく関数の 1 つで検証されていない状態があり、実行時に次のエラーがスローされていることです。
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)
私の部分からの関数の作成が悪いというよりも、ライブラリの悪い使用法に関連するものではないと思います。うまくいかずにいくつかのことを変更してきましたが、範囲外の状態がどこで発生しているかがわかれば、本当に役に立ちます。