• 10304阅读
  • 2回复

[提问]Qt  QextSerialPort  串口 多线程 问题 [复制链接]

上一主题 下一主题
离线reynoldxu
 

只看楼主 倒序阅读 楼主  发表于: 2011-11-26
大家好:
      之前做过一个串口数据接收并且绘图的东西,但是发现当串口不停发送数据时,界面会卡死不响应,于是我想把串口接收数据放到QThread中,解析完数据后传给主线程UI绘图.
      但是现在Qthread中要连接槽函数,我的要在run()中初始化,在定时器的槽函数中读取数据,这样实际读取数据的那个槽函数依旧是在主线程中,大数据量时依旧卡死...
      不知道各位大牛碰到类似的问题都是怎么解决的,请教.
贴上新开的线程代码


  1. //.h
  2. #ifndef SERIALPORTTHREAD_H
  3. #define SERIALPORTTHREAD_H
  4. #include <QWidget>
  5. #include <QTimer>
  6. #include <QDebug>
  7. #include "qextserialport.h"
  8. /*POSIX CODE*/
  9. #ifdef _TTY_POSIX_
  10. #define QextBaseType Posix_QextSerialPort
  11. /*MS WINDOWS CODE*/
  12. #else
  13. #define QextBaseType Win_QextSerialPort
  14. #endif
  15. //========================================
  16. class SerialPortThread: public QThread
  17. {
  18.     Q_OBJECT
  19. public:
  20.     SerialPortThread();
  21.     ~SerialPortThread();
  22.     void run();
  23.     QextSerialPort SerialPort;
  24. private slots:
  25.     void readComData();
  26. };
  27. #endif // SERIALPORTTHREAD_H
  28. //.cpp
  29. #include "serialportthread.h"
  30. SerialPortThread::SerialPortThread()
  31. {
  32. }
  33. SerialPortThread::~SerialPortThread()
  34. {
  35.     qDebug()<<"~SerialPortThread()";
  36. }
  37. void SerialPortThread::readComData()//实际接收函数没有在run()里,没进线程
  38. {
  39.     QByteArray temp = SerialPort.readAll();
  40.     //if(temp.isEmpty())return;
  41.     qDebug()<<"In SerialPortThread::readComData()"<<temp.toHex();
  42. }
  43. void SerialPortThread::run(){
  44.     QTimer readComTimer;
  45.     QTimer transmitComTimer;
  46.     bool isOpened = false;
  47.     //for SerialPort
  48.     SerialPort.setQueryMode(QextSerialPort::Polling);
  49.     readComTimer.setInterval(1500);
  50.     transmitComTimer.setInterval(1500);
  51.     //for Init com
  52.     SerialPort.setPortName("COM7");
  53.     SerialPort.setBaudRate(BAUD115200);
  54.     SerialPort.setDataBits(DATA_8);
  55.     SerialPort.setParity(PAR_NONE);
  56.     SerialPort.setStopBits(STOP_1);
  57.     SerialPort.setFlowControl(FLOW_OFF);
  58.     SerialPort.setTimeout(200);
  59.     SerialPort.open(QIODevice::ReadWrite);
  60.     isOpened = SerialPort.isOpen();
  61.     qDebug()<<"isOpen = "<<isOpened;
  62.     connect(&readComTimer,SIGNAL(timeout()),this,SLOT(readComData()));
  63.     readComTimer.start();
  64.     this->exec();
  65. }


离线dbzhang800

只看该作者 1楼 发表于: 2011-11-26
先换个新一点的 QextSerialPort 再试

如果有bug,请在
http://code.google.com/p/qextserialport/issues/list
提交
离线leesonlog
只看该作者 2楼 发表于: 2012-04-11
我也碰到这个问题了,现在算是解决了:


你应该设置下创建QextSerialPort对象的时候传入的PortSettings结构体里的Timeout_Sec或者Timeout_Millisec,
也就是设置下超时,把超时设得小点就行了(设置成0也是不行的,我试过),我设置的是50毫秒(因为我的应用场景中,串口最快也是每秒接收3个数据包)。


估计是QextSerialPort内部实现read函数的时候,仅当串口持续(Timeout_Sec+Timeout_Millisec)时间没有接收到数据时才返回,换言之,只要在(Timeout_Sec+Timeout_Millisec)时间内能读到数据,则read函数不返回。


把超时设置小点以后,能让read函数及时返回!
快速回复
限100 字节
 
上一个 下一个