Qt -串口操作

串口简介

     串口通常指COM接口,是采用串行通信方式的扩展接口。通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),大大降低了成本,特别适用于远距离通信,但传送速度较慢

     串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。


串口调试中注意的几点:

     1、不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必须通过转换器才能连接。

     2、串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;

     3、强烈建议不要带电插拨串口,否则串口易损坏。

     4、对于大型的工控和测量设备,建议使用光电耦合器来隔离设备,具体的耐压值根据实际需求来确定。

Qt串口编程

     pro文件中需要加入 :

          QT += serialport


     串口类:

          QSerialPort

          QSerialPortInfo



     编程流程

          1、首先获取串口名称,用名称来打开串口。

	foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
     
        qDebug() << "serial:" << info.portName();
    }

          2、查看该串口是否被打开,若打开则关闭。之后打开

	QSerialPort *SerialPort = new QSerialPort;
	SerialPort->setPortName("xxx");						// 传入参数由步骤1得来
	if(SerialPort->isOpen())
    {
     
        SerialPort->clear();
        SerialPort->close();
    }

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

          3、该串口对象设置基本参数

	serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);    // 设置波特率和读写方向
    serialPort->setDataBits(QSerialPort::Data8);                                    // 数据位为8位
    serialPort->setFlowControl(QSerialPort::NoFlowControl);                         // 无流控制
    serialPort->setParity(QSerialPort::NoParity);                                   // 无校验位
    serialPort->setStopBits(QSerialPort::OneStop);                                  // 一位停止位

          4、该串口对象对数据的收发

	// 接收数据
	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);
        	}
   	 	}
	}

          5、关闭串口

	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

你可能感兴趣的:(Qt)