C++ 串行端口与c+中的线程冲突+;
这是我的简化类,用于检测完整程序中的问题: SimpleThread.hC++ 串行端口与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
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);