串口(Serial Port)是计算机用于与外部设备进行数据通信的一种通信接口。它是一种通过逐位传输数据的方式来进行通信的接口,与并行口(Parallel Port)相对。串口通常用于连接各种外部设备,如调制解调器、打印机、传感器、嵌入式系统等。
RS-232串口通信
RS-232(Recommended Standard 232)是一种串行通信接口标准,定义了在计算机和外设之间进行串行数据传输的规则和电气特性。它包括一个DB-25或DE-9串口连接器和一组通信协议,用于实现点对点的串行通信。
在RS-232串口通信中,没有明确的主从之分,而是采用点对点通信的方式。
RS-232串口通信采用的是全双工通信方式。
相关类:
QSerialPort类:该类提供了对串口通信的支持。它可以用于打开、关闭、读写串口数据等操作,还可以设置串口的参数,如波特率、数据位、校验位、停止位等。
QSerialPortInfo类:该类提供了有关计算机上可用串口列表的信息,例如串口名称和描述。
在pro文件中添加模块:
QT += serialport
QSerialPort类
bool QSerialPort::open(QIODevice::OpenMode mode)
打开串口,mode参数指定打开模式。如果打开成功,返回true;否则返回false。
void QSerialPort::close()
关闭串口,并释放相关资源。
qint64 QSerialPort::read(char *data, qint64 maxSize)
从串口读取数据,最多读取maxSize个字节,存储在data中。返回实际读取的字节数。
QByteArray QSerialPort::readAll()
读取串口缓冲区中所有可用的数据,并以QByteArray类型返回。
qint64 QSerialPort::write(const char *data, qint64 maxSize)
向串口写入数据,写入最多maxSize个字节,数据存储在data中。返回实际写入的字节数。
void QSerialPort::clear()
清空串口缓冲区。
void QSerialPort::setPortName(const QString &name)
设置串口的名称。
void QSerialPort::setBaudRate(qint32 baudRate, QSerialPort::Directions directions = AllDirections)
设置串口的波特率。directions参数指定设置的方向,可选的值为AllDirections、Input、Output。
void QSerialPort::setDataBits(QSerialPort::DataBits dataBits)
设置串口数据位的个数。
void QSerialPort::setParity(QSerialPort::Parity parity)
设置串口的校验位类型。
void QSerialPort::setStopBits(QSerialPort::StopBits stopBits)
设置串口的停止位的个数。
void QSerialPort::setDataTerminalReady(bool set = true)
设置串口的数据终端就绪状态(DTR)。
void QSerialPort::setRequestToSend(bool set = true)
设置串口的请求发送状态(RTS)。
void QSerialPort::errorOccurred(QSerialPort::SerialPortError error)
当串口出现错误时,会发出errorOccurred信号。
void QSerialPort::readyRead()
当串口有数据可读取时,会发出readyRead信号。
bool QSerialPort::isOpen() const
判断串口是否已经打开。
QSerialPortInfo类
static QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
这个静态函数返回一个QList<QSerialPortInfo>
列表,包含了当前计算机上可用的串口信息。可以通过遍历这个列表来获取每个串口的详细信息。
QString QSerialPortInfo::portName() const
返回串口的名称。串口名称一般以"COM"或"/dev/tty"开头,后面跟着一个数字或字母,用于唯一标识每个串口。
QString QSerialPortInfo::description() const
返回串口的描述信息。描述信息通常包括串口的型号和其他相关信息。
QString QSerialPortInfo::manufacturer() const
返回串口的制造商信息。制造商信息用于标识串口的生产厂家。
bool QSerialPortInfo::isNull() const
判断当前QSerialPortInfo对象是否为空。如果为空,则表示该对象不包含有效的串口信息。
使用流程:
- 创建QSerialPort对象,并设置串口参数(波特率、数据位、校验位、停止位等)。
- 打开串口,开始通信。
- 通过QSerialPort类的read()函数读取串口数据,通过write()函数向串口发送数据。
- 在不需要通信时,关闭串口并释放资源。
配置串口:
串口参数主要包括波特率、数据位、校验位和停止位。
波特率(Baud Rate)
指单位时间内传输的比特数。在串口通信中,波特率用于标识数据传输速率,它定义了每秒钟发送或接收的比特数。常见的波特率有9600、19200、38400、57600等。
RS-232-C标准规定的传输速率为50,75,100,150,300,600,1200,2400,4800,9600,19200,38400,常用9600bps
serialPort.setBaudRate(QSerialPort::Baud9600);
数据位(Data Bits)
指在一个字符中,用于传输数据的比特位数。一般情况下,数据位为5、6、7、8位之一。其中,7位和8位比较常用。
标准ASCII码是0127(7位),扩展的ASCII码是0255(8位),如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始\停止位,数据位和奇偶校验位
serialPort.setDataBits(QSerialPort::Data8);
校验位(Parity)
校验位是为了保证数据的正确性而在数据位后增加的一位校验码。
校验位可以采用奇校验、偶校验、无校验三种方式:
- 奇校验表示校验位被设置为1使得整个字符中1的个数为奇数;
- 偶校验表示校验位被设置为0使得整个字符中1的个数为偶数;
- 无校验表示不进行校验。
serialPort.setParity(QSerialPort::NoParity);
停止位(Stop Bits)
指在一个字符的末尾用于标识字符结束的比特位数。一般情况下,停止位为1或2位。其中,1位比较常用。
serialPort.setStopBits(QSerialPort::OneStop);
代码示例:
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
//打印当前计算机上可用的串口列表
void printSerialPortList()
{
QList&l