我用C ++写了一个小代码,它读取串行端口中的数据,有时在调用回调时写入串行端口。我正在C ++中使用此库进行串行通信:
http://wjwwood.io/serial/doc/1.1.0/index.html
我的问题是,有时串行端口会停止写数据(这种情况很少发生,但会发生),并且我还需要对串行端口写两次,以便在串行数据中进行更改。出于调试目的,我添加了输出,以显示已读取的数据和已写入的数据。
这是我的代码:
void UART::run()
{
while(ros::ok())
{
_letter = _serial.read();
if (_serial.available() > 0)
{
_line.clear();
_line = _serial.readline(65536, "!");
_words.clear();
std::istringstream f(_line);
std::string s;
while (getline(f,s,'\t'))
{
_words.push_back(s);
}
this->fillVars();
_msg.velocity = _velocity;
_msg.position = _position;
_pub.publish(_msg);
ros::spinOnce();
}
_serial.flush();
}
}
void UART::fillVars()
{
if (_words[0] == "u")
{
_ultrasonic = std::stoi(_words[1]);
}
else if (_words[0] == "s")
{
std::cout << "reading " << _words[1] << std::endl;
}
}
void UART::callback(const std_msgs::Int32::ConstPtr& speed)
{
// Convert m/s and serial write
_effort = speed->data - 32;
std::string toWrite = std::to_string(_effort);
size_t temp = _serial.write(toWrite);
std::cout << "Writing :" << toWrite << std::endl;
}
代码始终在run()
函数中运行,并在发生回调时暂停。
目前序列中唯一的数据是:
!s 23
其中23是任何整数,我只是在编写以在调用回调时更改整数。
那么我的代码有什么问题呢?为什么我需要两次调用回调才能更改序列中的数据,为什么有时写不会发生(我的假设是while循环被卡住了)?