STD::使用LB系列库C++代码中的Office范围错误 我在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"; }

STD::使用LB系列库C++代码中的Office范围错误 我在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"; },c++,outofrangeexception,libserial,C++,Outofrangeexception,Libserial,我不认为这与库的错误使用有关,而与我的角色创建的函数错误有关。我一直在改变一些事情,但没有任何运气,如果你知道哪里发生了超出范围的情况,这将真的帮助我 main、serial\u setup和serial\u read函数使用它们自己的本地SerialStream变量,因此不会保留更改。您应该通过引用从main传递SerialStream实例: void serial_setup(SerialStream & serial_port){ void serial_read(SerialS

我不认为这与库的错误使用有关,而与我的角色创建的函数错误有关。我一直在改变一些事情,但没有任何运气,如果你知道哪里发生了超出范围的情况,这将真的帮助我

main、serial\u setup和serial\u read函数使用它们自己的本地SerialStream变量,因此不会保留更改。您应该通过引用从main传递SerialStream实例:

void serial_setup(SerialStream & serial_port){

void serial_read(SerialStream & serial_port){

或者实际将SerialStream封装到对象中,其中serial_setup成为构造函数,serial_read成为方法,serial_port.Close;成为析构函数。

您现在有两个SerialStreams:serial\u安装程序创建一个stream对象,打开一个端口,设置波特率,然后在函数结束时超出范围,可能会关闭端口。接下来,serial_read创建一个新的流对象,从不将其连接到物理端口,然后尝试从不存在的端口读取,但失败。严格地说,这个类可能不是那样工作的,但上面的场景是最有可能的。Ken Y-N的解释很好,这样分析完全有意义。使用VTT方案解决此问题。非常感谢您的帮助。我应该以这种方式声明main之外的函数,然后无论何时从main调用函数,我都应该将其称为serial_setupserial_port?是的。这样所有函数都将使用main中声明的串行端口。无需担心…我确认这是有效的。非常感谢VTT!
void serial_setup(SerialStream & serial_port){

void serial_read(SerialStream & serial_port){