Qt串口通信
使用QSerialPort和QSerialPortInfo,对日常使用进行了封装。
在实际使用Qt串口过程中,出现多次触发readyRead()信号,一次性使用readAll()并不能获取所有数据,可以通过修改通信协议,在本封装中采用的是延时,在接受到readyRead信号时进行倒计时,在倒计时结束之前,将接收到的信号存入一个缓冲区。
头文件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/*
* serial.h
* 创建时间: 2022/5/9
* 描述: 封装串口通信。
*
* 修改时间: 2022/5/23
* 修改描述:
* 添加readReady()可修改时长接口
*
* 修改时间: 2022/5/9
* 修改描述:
* Qt在大量数据通信时会多次触发readyRead()信号,
* 本文件使用了QTimer在第一次触发readyRead()信号时计
* 时,每次触发的readyRead()信号添加到临时缓冲区,当
* 计时终止时,将临时缓冲区内的内容复制给缓冲区,清空
* 临时缓冲区。延时时间请根据实际情况进行修改
*/
class Serial:public QObject
{
Q_OBJECT
public:
Serial();
bool isOpen = false; // 串口是否已打开
QStringList scanSerial(); // 扫描可用串口
QStringList standardBaudRates(); // 获取标准波特率列表
bool open(QString serialName, int baudRate,QSerialPort::DataBits databits=QSerialPort::Data8,
QSerialPort::Parity parity = QSerialPort::NoParity,QSerialPort::StopBits stopBits=QSerialPort::OneStop,
QSerialPort::FlowControl flowControl=QSerialPort::NoFlowControl); // 打开串口
void close(); // 关闭串口
void sendData(QByteArray &sendData); // 发送数据给下位机
QByteArray getReadBuf(); // 获得读取数据缓冲区
void clearReadBuf(); // 清除读取数据缓冲区
void setReadTime(int mesc); // 设置读取时长
int getReadTime(); // 获取当前读取时长
signals:
void readSignal(); // 当下位机中有数据发送过来触发该信号
void readBufSignal(); // 计时器终止触发
public slots:
void readData(); // 读取数据
void timerUpdate();
private:
QSerialPort *m_serialPort; // 实例化一个指向串口的指针,可以用于访问串口
QSerialPortInfo *m_serialPortInfo; // 实例化QSerialPortInfo
QByteArray m_tmpBuf; // 临时存储下位机发来数据,因为大量数据通信Qt会多次分发
QByteArray m_readBuf; // 返回读取的数据缓冲区
QTimer *m_timer; // 时间对象
int readTime; // 缓冲区读取时长
};
1 |
|






