Qt serial communication (QSerialPort) (convertStringToHex) (convertCharToHex)

https://blog.csdn.net/weixin_42837024/article/details/81669540

Preface:

This article is about QSerialPort in qt5 + version of the above have

qt 4.x + linux environment Look at this

text

And the next machine, and ultimately, the communication microcontroller to communicate using the serial port, the Qt also provides a serial communication class

QSerialPort

https://doc.qt.io/qt-5.9/qserialport.html //小伙伴们具体去看文档

  
  
  • 1

When using the phrase add import modules in QT + = SerialPort Pro
1. The first step is to connect serial acquired first of all connected to the serial port name

QSerialPortInfo::availablePorts()
[static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
Returns a list of available serial ports on the system.
返回系统上可用串行端口的列表
  • 1
  • 2
  • 3
  • 4
  • 5

QSerialPortInfo

Provides information about existing serial ports.
Use the static functions to generate a list of QSerialPortInfo objects. Each QSerialPortInfo object in the list represents a single serial port and can be queried for the port name, system location, description, and manufacturer. The QSerialPortInfo class can also be used as an input parameter for the setPort() method of the QSerialPort class.
See also QSerialPort.

Provide information on existing serial port.
QSerialPortInfo using static function to generate a list of objects. QSerialPortInfo each object in the list represents a serial port, you can query the port name, system location, and described by the manufacturer. QSerialPortInfo class may also be used setPort QSerialPort class () method of the input parameters.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

// so that we get to an available serial port the name

QStringList m_serialPortName;
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
m_serialPortName << info.portName();
qDebug()<<“serialPortName:”<<info.portName();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

After obtaining a list of names to the serial port, we need to select a required connection (according to their own choice)

2. Open the serial port according to name

#include<QSerialPort>

QSerialPort * m_serialPort = new new QSerialPort ( ) ; // instantiate an object class serial

IF ( m_serialPort - > the isOpen ( ) ) // If the serial port is already opened his closed give
{
m_serialPort - > Clear ( ) ;
m_serialPort - > Close ( ) ;
}

// set the serial port names above assume that we have successfully acquired and to use the first
m_serialPort - > setPortName ( m_serialPortName [ 0 ] ) ;

IF ( ! m_serialPort - > Open ( a QIODevice :: ReadWrite ) ) // try to open with a ReadWrite mode serial
{
qDebug ( ) << m_serialPortName [ 0 ] << "open failed!" ;
return ;
}
// open succeeded

m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setBaudRate</span><span class="token punctuation">(</span>QSerialPort<span class="token operator">::</span>Baud115200<span class="token punctuation">,</span>QSerialPort<span class="token operator">::</span>AllDirections<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//设置波特率和读写方向</span>
m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setDataBits</span><span class="token punctuation">(</span>QSerialPort<span class="token operator">::</span>Data8<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//数据位为8位</span>
m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setFlowControl</span><span class="token punctuation">(</span>QSerialPort<span class="token operator">::</span>NoFlowControl<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//无流控制</span>
m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setParity</span><span class="token punctuation">(</span>QSerialPort<span class="token operator">::</span>NoParity<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//无校验位</span>
m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setStopBits</span><span class="token punctuation">(</span>QSerialPort<span class="token operator">::</span>OneStop<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一位停止位</span>

<span class="token comment">//连接信号槽 当下位机发送数据QSerialPortInfo 会发送个 readyRead 信号,我们定义个槽void receiveInfo()解析数据</span>
<span class="token function">connect</span><span class="token punctuation">(</span>m_serialPort<span class="token punctuation">,</span><span class="token function">SIGNAL</span><span class="token punctuation">(</span><span class="token function">readyRead</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token keyword">this</span><span class="token punctuation">,</span><span class="token function">SLOT</span><span class="token punctuation">(</span><span class="token function">receiveInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3. The lower computer (SCM), PC (Qt program) transmits interactive data

	//接收单片机的数据
	void receiveInfo()
	{
		QByteArray info = m_serialPort->readAll();
		QByteArray hexData = info.toHex();
		//这里面的协议 你们自己定义就行  单片机发什么 代表什么 我们这里简单模拟一下
		if(hexData == "0x10000")
		{
			//do something
		}
		else if(hexData  == "0x100001")	
		{
			//do something
		}
<span class="token punctuation">}</span>
<span class="token comment">//向单片机发送数据</span>

<span class="token comment">//基本和单片机交互 数据 都是16进制的 我们这里自己写一个 Qstring 转为 16进制的函数	</span>
<span class="token keyword">void</span> <span class="token function">convertStringToHex</span><span class="token punctuation">(</span><span class="token keyword">const</span> QString <span class="token operator">&amp;</span>str<span class="token punctuation">,</span> QByteArray <span class="token operator">&amp;</span>byteData<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">int</span> hexdata<span class="token punctuation">,</span>lowhexdata<span class="token punctuation">;</span>
    <span class="token keyword">int</span> hexdatalen <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">int</span> len <span class="token operator">=</span> str<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    byteData<span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span>len<span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> lstr<span class="token punctuation">,</span>hstr<span class="token punctuation">;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">&lt;</span>len<span class="token punctuation">;</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token comment">//char lstr,</span>
        hstr<span class="token operator">=</span>str<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toLatin1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span>hstr <span class="token operator">==</span> <span class="token string">' '</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            i<span class="token operator">++</span><span class="token punctuation">;</span>
            <span class="token keyword">continue</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        i<span class="token operator">++</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">&gt;=</span> len<span class="token punctuation">)</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        lstr <span class="token operator">=</span> str<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toLatin1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        hexdata <span class="token operator">=</span> <span class="token function">convertCharToHex</span><span class="token punctuation">(</span>hstr<span class="token punctuation">)</span><span class="token punctuation">;</span>
        lowhexdata <span class="token operator">=</span> <span class="token function">convertCharToHex</span><span class="token punctuation">(</span>lstr<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hexdata <span class="token operator">==</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>lowhexdata <span class="token operator">==</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">else</span>
            hexdata <span class="token operator">=</span> hexdata<span class="token operator">*</span><span class="token number">16</span><span class="token operator">+</span>lowhexdata<span class="token punctuation">;</span>
        i<span class="token operator">++</span><span class="token punctuation">;</span>
        byteData<span class="token punctuation">[</span>hexdatalen<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">char</span><span class="token punctuation">)</span>hexdata<span class="token punctuation">;</span>
        hexdatalen<span class="token operator">++</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    byteData<span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span>hexdatalen<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">//另一个 函数 char 转为 16进制</span>
<span class="token keyword">char</span> SerialPort<span class="token operator">::</span><span class="token function">convertCharToHex</span><span class="token punctuation">(</span><span class="token keyword">char</span> ch<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment">/*
    0x30等于十进制的48,48也是0的ASCII值,,
    1-9的ASCII值是49-57,,所以某一个值-0x30,,
    就是将字符0-9转换为0-9

    */</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">&gt;=</span> <span class="token string">'0'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>ch <span class="token operator">&lt;=</span> <span class="token string">'9'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
         <span class="token keyword">return</span> ch<span class="token operator">-</span><span class="token number">0x30</span><span class="token punctuation">;</span>
     <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">&gt;=</span> <span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>ch <span class="token operator">&lt;=</span> <span class="token string">'F'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
         <span class="token keyword">return</span> ch<span class="token operator">-</span><span class="token string">'A'</span><span class="token operator">+</span><span class="token number">10</span><span class="token punctuation">;</span>
     <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">&gt;=</span> <span class="token string">'a'</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>ch <span class="token operator">&lt;=</span> <span class="token string">'f'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
         <span class="token keyword">return</span> ch<span class="token operator">-</span><span class="token string">'a'</span><span class="token operator">+</span><span class="token number">10</span><span class="token punctuation">;</span>
     <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>


<span class="token comment">//写两个函数 向单片机发送数据 </span>
<span class="token keyword">void</span> <span class="token function">sendInfo</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span> info<span class="token punctuation">,</span><span class="token keyword">int</span> len<span class="token punctuation">)</span><span class="token punctuation">{</span>

	<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">&lt;</span>len<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"0x%x\n"</span><span class="token punctuation">,</span> info<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">write</span><span class="token punctuation">(</span>info<span class="token punctuation">,</span>len<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档 </span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">sendInfo</span><span class="token punctuation">(</span><span class="token keyword">const</span> QString <span class="token operator">&amp;</span>info<span class="token punctuation">)</span><span class="token punctuation">{</span>

	QByteArray sendBuf<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>info<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        info<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token function">QString</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token function">QString</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//我这里是把空格去掉,根据你们定的协议来</span>
    <span class="token punctuation">}</span>
    <span class="token function">qDebug</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&lt;&lt;</span><span class="token string">"Write to serial: "</span><span class="token operator">&lt;&lt;</span>info<span class="token punctuation">;</span>
    <span class="token function">convertStringToHex</span><span class="token punctuation">(</span>info<span class="token punctuation">,</span> sendBuf<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//把QString 转换 为 hex </span>
    
    m_serialPort<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">write</span><span class="token punctuation">(</span>sendBuf<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">////这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档</span>

<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

4. Close the serial port when destructor

    if (m_serialPort->isOpen())
    {
        m_serialPort->close();
    }
    delete m_serialPort;

  
  
  • 1
  • 2
  • 3
  • 4
  • 5

## Source:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QComboBox>
#include <QPushButton>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

<span class="token keyword">void</span> <span class="token function">initUI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

QStringList <span class="token function">getPortNameList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取所有可用的串口列表</span>

<span class="token keyword">void</span> <span class="token function">openPort</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//打开串口</span>

public slots:
void receiveInfo();
private:
Ui::Widget onion ;
QSerialPortm_serialPort ; // serial type
a QStringList m_portNameList ;

QComboBox<span class="token operator">*</span> m_PortNameComboBox<span class="token punctuation">;</span>
QPushButton<span class="token operator">*</span> m_OpenPortButton<span class="token punctuation">;</span>

};

#endif // WIDGET_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

widget.cpp

 
Published 42 original articles · won praise 148 · views 410 000 +

Guess you like

Origin blog.csdn.net/baidu_37503452/article/details/104411454