首页| 论坛| 消息

标题:QserialPort与QThread使用
作者:harold00124
日期:2016-11-04 12:44
内容:

不好意思又来请教各位大大了
这次老板出的作业是要我做
要和RS232做全雙工的資料傳送接收
port插入後會有Tx跟Rx兩個 port 在電腦新增com5.com6(老板有给我USB的RS458模拟盒当做测试器)
目前我查資料之後按照我自己的想法可能會需要用到
QThread創造兩個線程確保全雙工進行傳送接收
用QMutex確保傳送接收資料不阻塞
QserialPort抓取port放到combobox內
用readall()接收 用write傳送
按一個pushbutton後開啟全雙工傳送接收 输入与显示初步設定顯示在lineEdit 1、2
線路中斷的時候自動出現提示messagebox提示錯誤並且終止程式線程
请问 如何使用QserialPort主动抓取所有可用的port并且放入combobox的addItem内
QThread要如何配合使用?
我自己有练习2个单功能的程式
头文件 mythread
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include
class mythread : public QThread
{
public:
mythread();//新增線程類
void run();//線程函數
QString name;
};
#endif // MYTHREAD_H
-----------------------------------------------------------------
主文件main

#include
#include"mythread.h" //帶入線程標頭
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
mythread mthread1;//線程子類1
mthread1.name="mthread1";
mythread mthread2;//線程子類2
mthread2.name="mthread2";
mythread mthread3;//線程子類3
mthread3.name="mthread3";
mthread1.start(QThread::HighestPriority);//執行1 優先權設定為高
mthread2.start();//執行2
mthread3.start(QThread::HighestPriority);//執行3 優先權設定為高
return a.exec();
}
----------------------------------------------------------------------------------
#include "mythread.h"
#include
mythread::mythread()
{
}
void mythread::run()
{
qDebug()


#1 [harold00124 11-04 13:07]
我已经找到抓取port的方式了
#include


foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comboBox->addItem(info.portName());
}
请问一下foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())这句到底是在说蛇么啊? 如何运作的??


還有



void MainWindow::on_pushButton_2_clicked()
{
serial->setPortName(ui->comboBox->currentText());//窗口號
serial->setBaudRate(QSerialPort::Baud9600);//傳輸率
serial->setDataBits(QSerialPort::Data8);//數據位
serial->setParity(QSerialPort::NoParity);//較驗位
serial->setStopBits(QSerialPort::OneStop);//停止位
serial->setFlowControl(QSerialPort::NoFlowControl);//設置流控制
serial->open(QIODevice::ReadWrite);//功能設定 讀寫
serial->write("OK*");//預設傳輸資料
serial->write(ui->lineEdit_2->text().toStdString().data());
}

我開程式後選com5 按鍵執行後com5的燈會亮
但是我選com6就還是亮com5的燈
反之亦然 請問這是怎麼回事 我哪裡做錯了嗎?
怎麼選只能選一次 後面再改comport都沒用了
#2 回 harold00124 的帖子 [bran_lee 11-04 15:59]
harold00124:我已经找到抓取port的方式了
#include


foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
....... (2016-11-04 13:07)
你改端口参数前都不需要close吗?
#3 回 bran_lee 的帖子 [harold00124 11-04 16:21]
bran_lee:你改端口参数前都不需要close吗?
(2016-11-04 15:59)
喔 我懂了 謝謝大大 我從你說的close去找資料終於發現自己的問題了@@....

serial->close();
serial->setPortName(ui->comboBox->currentText());//窗口號
serial->open(QIODevice::ReadWrite);//功能設定 讀寫
serial->setBaudRate(QSerialPort::Baud9600);//傳輸率
serial->setDataBits(QSerialPort::Data8);//數據位
serial->setParity(QSerialPort::NoParity);//較驗位
serial->setStopBits(QSerialPort::OneStop);//停止位
serial->setFlowControl(QSerialPort::NoFlowControl);//設置流控制
serial->write("OK*");//預設傳輸資料
serial->write(ui->lineEdit_2->text().toStdString().data());
Open跟close拉一下就搞定了 真是..
#4 [harold00124 11-07 16:41]
再次感谢大大的提点

.portfors232.rar (6 K) 下载次数:0

后来我问了一下我的老板 要做全双工到底传输量有多大?

老板回答我说1K以下跟我原本预想500K以上相差巨大

由于传输量不大所以我没有用多线程的方式..话说多线程的QserialPort我到现在还是看不懂

使用设定
选择好RT 与TX后按下Set Port会将combbox选取的值设定到TXRX的设定值内并且清空所有textEdit的内容
设定好TXRX后 在lineEdit内输入想要传送的资料 会把资料传送到TX Port 并且在传送textEdit

还请大神多多关照 如可以的话可以稍为指点小弟多线程QserialPort就更千恩万谢了


以下代码区
头文件


#include
#include

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
[backcolor= ..
#5 回 harold00124 的帖子 [bran_lee 11-08 11:14]
harold00124:再次感谢大大的提点

portfors232.rar (6 K) 下载次数:0

后来我问了一下我的老板 要做全双工到底传输量有多大?
....... (2016-11-07 16:41) 
我觉得你首先需要了解QThread的用法,run和moveToThread,还有信号的几种连接方式的区别。然后要在线程里用QSerialPort,要注意new、读、写操作都应该在同一个线程内完成,如果你以后用到多线程的socket,这是同样要注意的问题。除非传输量真的很大,读写非常频繁,否则不要轻易用,比较麻烦。

回复 发表
主题 版块