C++ 串行端口与c+中的线程冲突+;

C++ 串行端口与c+中的线程冲突+;,c++,multithreading,class,serial-port,C++,Multithreading,Class,Serial Port,这是我的简化类,用于检测完整程序中的问题: SimpleThread.h class SimpleThread { public: SimpleThread(); ~SimpleThread(); void startThread(); void threadFn(); private: SerialPort mySerial; std::thread myThread; int count; std::mutex myM

这是我的简化类,用于检测完整程序中的问题:

SimpleThread.h

class SimpleThread {
public:

    SimpleThread();
    ~SimpleThread();

    void startThread();
    void threadFn();

private:

    SerialPort mySerial;

    std::thread myThread;
    int count;
    std::mutex myMutex;
};
SimpleThread.cpp

SimpleThread::SimpleThread(): mySerial("/dev/ttyACM0") {
    count = 0;
    mySerial.Open(//Here correct params//);
}

SimpleThread::~SimpleThread() {}

void SimpleThread::threadFn() {

    char cp;

    while (true) {
        cp = mySerial.ReadByte(0);
        std::cout << count++ << " " << cp << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

void SimpleThread::startThread() {
    myThread = std::thread(&SimpleThread::threadFn, this);
    myThread.detach();
}
int main() {

    SimpleThread thr;
    thr.startThread();

    while (true) {
        std::cout << "Waiting 5 seconds" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
}
SimpleThread::SimpleThread():mySerial(“/dev/ttyACM0”){
计数=0;
mySerial.Open(//这里是正确的参数//);
}
SimpleThread::~SimpleThread(){}
void SimpleThread::threadFn(){
字符cp;
while(true){
cp=mySerial.ReadByte(0);
std::cout使用基于信号的异步I/O(
SIGIO
),GCC 5()中有一个错误,
std::this_thread::sleep_for
被信号中断。它已在GCC 6中修复

可能的解决办法是:

  • 将编译器升级到GCC 6+或clang/LLVM
  • 使用bug中提到的解决方法,或者尝试
    睡眠\u直到

    auto wakeup_time = std::chrono::steady_clock::now() + std::chrono::seconds(1);
    std::this_thread::sleep_until(wakeup_time);
    
  • 使用阻塞I/O(我相信您可以简单地将串行设备作为文件打开并从中读取)

你的问题很难理解。你向我们展示的代码是符合你期望的代码?还是不符合你期望的代码?@RustyX很抱歉我的英语不太纯正,我尽力做到最好。每读一个字节后,主循环每秒打印大约40次。@Jameslarg也很抱歉我的英语不太纯正。This代码没有达到我预期的效果,因为尽管有睡眠功能,主循环每秒打印大约40次消息。我会编辑我的帖子。谢谢你的回答!我已经在没有这个库的情况下通过简单的字节读取更改了我的代码,并且它正常工作。所以这肯定是libserial中的错误,你已经确认了我的建议。再次感谢你希望得到帮助和理解!
if ( mySerial.IsDataAvailable() ) {
    std::cout << count++ << " " << cp << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
}
auto wakeup_time = std::chrono::steady_clock::now() + std::chrono::seconds(1);
std::this_thread::sleep_until(wakeup_time);