C ++中的UART通信不可靠

时间:2019-04-25 09:56:12

标签: c++

我用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循环被卡住了)?

0 个答案:

没有答案