• 3638阅读
  • 4回复

子线程中使用串口 [复制链接]

上一主题 下一主题
离线celerylxq
 

只看楼主 倒序阅读 楼主  发表于: 2015-09-02

希望在主线程中创建多个子线程,在各个子线程中进行串口数据收发及解析,发现在子线程中创建串口对象,总是不响应串口消息,readData()中打断点怎么都进不去,跪求大侠指点!
代码如下:
主线程中创建子线程:
QMyThread *MyThread = new QMyThread;      
MyThread->start();

子线程中创建串口对象:
void QMyThread::run()
{    
m_MyConn = new MyConnect(this,&(pRtuObj->m_strCommType),&(pRtuObj->m_sListSerialPara),&(pRtuObj->m_sListNetPara));  
m_MyConn->openCommu();  
m_MyConn->moveToThread(this);
}
打开串口:
//通信连接
void MyConnect::openCommu()
{  
if(m_Serial != NULL)  
{       delete m_Serial;       m_Serial = NULL;   }  
m_Serial = new QSerialPort;   connect(m_Serial, SIGNAL(readyRead()), this, SLOT(readData()));
m_Serial->setPortName(m_CommSettings.name);  
m_Serial->setBaudRate(m_CommSettings.baudRate);  
m_Serial->setDataBits(m_CommSettings.dataBits);    
m_Serial->setParity(m_CommSettings.parity);  
m_Serial->setStopBits(m_CommSettings.stopBits);    
if (m_Serial>open(QIODevice::ReadWrite))    
{      
SendEvent(tr("Connected to %1").arg(m_CommSettings.m_sListSerialPara.join(",")));    
   m_chCommuStatus = 1;  
}    
else  
{        
SendEvent(tr("Open Serial Error, %1").arg(m_CommSettings.m_sListSerialPara.join(",")));        
m_chCommuStatus = 0;    
}
}
串口读数据:
//串口读数据
void MyConnect::readData()
{  
QByteArray buffer = m_Serial->readAll();    
displayRxTxData(buffer);
}




离线yanwuyue

只看该作者 1楼 发表于: 2015-09-02
m_MyConn->openCommu();  
m_MyConn->moveToThread(this);
改成
m_MyConn->openCommu(this);  
//m_MyConn->moveToThread();//删除

void MyConnect::openCommu(QObject *p)
{
...
m_Serial = new QSerialPort(p);
...
}
离线yanwuyue

只看该作者 2楼 发表于: 2015-09-02
另外qt不推荐使用这种方式创建线程
离线celerylxq

只看该作者 3楼 发表于: 2015-09-04
回 yanwuyue 的帖子
yanwuyue:另外qt不推荐使用这种方式创建线程 (2015-09-02 17:33) 

感谢指点,上班了试试,顺便弱弱的问句,不用这种方式创建线程哪还有什么方式创建线程,再者,这种方式有什么弊端?
离线yanwuyue

只看该作者 4楼 发表于: 2015-09-06
线程内容放在一个QObject 里面
同时初始化这个QObject 类和QThread,
QObject 类 moveToThread 到这QThread,
用事件通讯
快速回复
限100 字节
 
上一个 下一个