Qt之串口通信
工具:QT5.9
使用了QSerialPort类,并且需在.pro文件上加 QT += serialport
还有QSerialPortInfo :Provides information about existing serial ports. 该类是一个串口的辅助类类,提供主要是提供系统已经存在串口的信息
好像Qt4 没有这个类
作用
单片机与上位机之间的通信
一、获取可用的串口号(QSerialPortInfo)
首先要获取当前可用的串口号,要用到QSerialPortInfo
QSerialPort *m_Usart = new QserialPort;
foreach(QSerialPortInfo info, QSerialPortInfo::availablePorts())
{
qDebug()<<info.portName();
ui->comboBox->addItem(info.portName());
}
二、串口创建&连接 (QSerialPort)
1.创建
QSerialPort *m_Usart = new QSerialPort();
bool Usart_Connect()
{
if(m_Usart->isOpen())
{
m_Usart->clear();
m_Usart->close();
}
if(ui->comboBox->currentText().isNull())
{
qDebug()<<"PortName Error!";
return false;
}
m_Usart->setPortName(ui->comboBox->currentText());
m_Usart->setBaudRate(115200);
m_Usart->setDataBits(QSerialPort::Data8);
m_Usart->setStopBits(QSerialPort::OneStop);
m_Usart->setParity(QSerialPort::NoParity);
if((m_Usart->baudRate()==-1) ||(m_Usart->dataBits()==-1) ||(m_Usart->stopBits()==-1) ||(m_Usart->parity()==-1))
return false;
m_Usart->setFlowControl(QSerialPort::NoFlowControl);
if(!m_Usart->open(QIODevice::ReadWrite))
{
qDebug()<<"Usart open Error!";
return false;
}
connect(m_Usart, SIGNAL(readyRead()), this, SLOT(Usart_RecvFunc()));
qDebug()<<"m_Usart_Connect executed";
return true;
}
2.读/写数据
QByteArray Recv_Data;
Recv_Data.resize(m_Usart->readBufferSize());
Recv_Data = m_Usart->readAll();
...
QString buf("abcde");
m_Usart->write(buf.toLatin1());
3.数据发送的格式
一般与单片机交互都是以16进制的格式进行交互,所以这里写一个互转函数(ByteArray转16进制的QString的互转)
QString BytearrayToHexstring(QByteArray data)
{
QString ret(data.toHex().toUpper());
qDebug()<<ret;
int len = ret.length()/2;
for(int i=1; i<len; i++)
{
qDebug()<<i;
ret.insert(3*i-1, " ");
}
qDebug()<<ret;
return ret;
}
QByteArray HexstringToBytearray(QString hexstring)
{
bool ok;
QByteArray ret;
hexstring = hexstring.trimmed();
hexstring = hexstring.simplified();
QStringList str_list = hexstring.split(" ");
foreach(QString str, str_list)
{
if(!str_list.isEmpty())
{
char c = str.toInt(&ok, 16) & 0xFF;
if(ok)
{
ret.append(c);
}else
{
qDebug()<<"hex->byte ERROR!";
return hexstring.toLatin1();
}
}
}
qDebug()<<ret;
return ret;
}
总结
主要用了QSerialPort和QSerialPortInfo两个类实现串口通信。
|