Qt-シリアルポート操作

23734 ワード

シリアルポートの概要
シリアル通信方式を採用した拡張インタフェースである.通信回線は簡単で、一対の伝送路で双方向通信(伝送路として電話線を直接利用できる)を実現でき、コストを大幅に低減し、特に遠隔通信に適しているが、伝送速度は遅い.
    シリアルインターフェースは、RS-232-C、RS-422、RS 485などを電気規格およびプロトコルによって分けられる.RS-232-C、RS-422およびRS-485規格は、コネクタ、ケーブル、またはプロトコルに関係なく、インタフェースの電気的特性のみを規定する.
シリアル・デバッグで注意すべき点:
     1、異なる符号化メカニズムは混在できない.例えば、RS 232 Cは直接RS 422インタフェースに接続できない.市販の各種変換器は販売されており、変換器を通じて接続しなければならない.
     2、シリアルポートデバッグ時、シリアルポートデバッグアシスタント、シリアルポート精霊など、使いやすいデバッグツールを用意し、半功倍の効果がある.
     3、帯電してシリアルポートを挿入しないことを強くお勧めします.そうしないと、シリアルポートが破損しやすいです.
     4、大型の工業制御と測定設備については、光電結合器を用いて設備を隔離することを提案し、具体的な耐圧値は実際の需要に応じて決定する.


Qtシリアルポートプログラミング
ファイルに追加する必要があります.
QT+=serialport
          QSerialPort
          QSerialPortInfo
プログラミングプロセス
まずシリアル名を取得し、名前でシリアルポートを開きます.
	foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
     
        qDebug() << "serial:" << info.portName();
    }


シリアルポートが開いているかどうかを確認し、開いている場合は閉じます.を選択して、
	QSerialPort *SerialPort = new QSerialPort;
	SerialPort->setPortName("xxx");						//        1  
	if(SerialPort->isOpen())
    {
     
        SerialPort->clear();
        SerialPort->close();
    }

	if(!serialPort->isOpen())
    {
     
        serialPort->open(QIODevice::ReadWrite);
    }


シリアル・オブジェクト設定の基本パラメータ
	serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);    //           
    serialPort->setDataBits(QSerialPort::Data8);                                    //     8 
    serialPort->setFlowControl(QSerialPort::NoFlowControl);                         //     
    serialPort->setParity(QSerialPort::NoParity);                                   //     
    serialPort->setStopBits(QSerialPort::OneStop);                                  //      


データの送受信を行うシリアル・オブジェクト
	//     
	connect(serialPort,&QIODevice::readyRead,this,[&]()
	{
     
		if(serialPort->bytesAvailable())
    	{
     
        	QByteArray data = serialPort->readAll();
        	serialPort->flush();
        	
        	// ToDo
    	}
	});

	//     
	void SerialPort::SendData(const QByteArray &data)
	{
     
   		if(serialPort && serialPort->isOpen())
    	{
     
        	if(data.size())
        	{
     
            	serialPort->write(data);
        	}
   	 	}
	}


シリアルポートを閉じる
	if(serialPort)
    {
     
        if(serialPort->isOpen())
        {
     
            serialPort->clear();
            serialPort->close();
        }

        delete serialPort;
    }
    serialPort = nullptr;



コードの概要
#include 
#include 

class SerialPort : public QObject
{
     
    Q_OBJECT
public:
    SerialPort(QObject *parent = nullptr)
    {
     
    	foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    	{
     
        	qDebug() << "serial:" << info.portName();
    	}

    	serialPort = new QSerialPort;
    	if(serialPort->isOpen())
    	{
     
        	serialPort->clear();
        	serialPort->close();
    	}

    	serialPort->setPortName("xxx");				//           ,       
   	 	if(!serialPort->isOpen())
    	{
     
        	serialPort->open(QIODevice::ReadWrite);
    	}
    	serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);    //           
    	serialPort->setDataBits(QSerialPort::Data8);                                    //     8 
    	serialPort->setFlowControl(QSerialPort::NoFlowControl);                         //     
    	serialPort->setParity(QSerialPort::NoParity);                                   //     
    	serialPort->setStopBits(QSerialPort::OneStop);                                  //      

    	connect(serialPort,&QIODevice::readyRead,this,&SerialPort::ReadyRead);
    }
    
    ~SerialPort()
    {
     
    	if(serialPort)
    	{
     
        	if(serialPort->isOpen())
        	{
     
            	serialPort->clear();
            	serialPort->close();
        	}

        	delete serialPort;
    	}
    	serialPort = nullptr;
    }

    void SendData(const QByteArray &)
    {
     
    	if(serialPort && serialPort->isOpen())
    	{
     
        	if(data.size())
        	{
     
            	serialPort->write(data);
        	}
    	}
    }

public slots:
    void ReadyRead()
    {
     
    	if(serialPort->bytesAvailable())
    	{
     
        	QByteArray data = serialPort->readAll();
        	serialPort->flush();
        	Data(data);
    	}
    }

signals:
	//        
    void Data(const QByteArray &);

private:
    QSerialPort *serialPort = nullptr;
};

   
に注目
微信公衆番号検索「Qt_io_」あるいは「Qt開発者センター」はQt、C++の開発に関する知識をもっと知っています.
筆者-jxd