Qt串口通信的打开串口:
//串口自动初始化并打开按钮槽函数
*bool MachineDescribe::AutoInitSerialAndOpen()
{
//如果串口未打开则自动搜索,打开串口
if(!(m_pSerialPort->isOpen()))
{
QStringList qlStrPortName;
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
qlStrPortName.append(info.portName());
}
if(!(qlStrPortName.count()))
{
QString strError = "Error:没有找到有效串口!";
LogInfoWritten(strError);
return false;
}
QString strSerialName = m_strSerialPortName;
m_pSerialPort->setPortName(strSerialName);
m_pSerialPort->setDataBits(QSerialPort::Data8);//数据位为8位
m_pSerialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
m_pSerialPort->setParity(QSerialPort::NoParity); //无校验位
m_pSerialPort->setStopBits(QSerialPort::OneStop); //一位停止位
// //
bool beIsConnect = connect(m_pSerialPort,SIGNAL(readyRead()),this,SLOT(slot_ReceiveInfo()));
qDebug() << "beIsConnect=" << beIsConnect;
if(!(m_pSerialPort->isOpen()))
{
bool bstat = m_pSerialPort->open(QIODevice::ReadWrite);
if(!bstat)
{
QString strError = "Error:串口打开失败!" + m_pSerialPort->errorString();
LogInfoWritten(strError);
return false;
}
m_pSerialPort->waitForReadyRead(250);
// setDataTerminalReady(true)
// m_pSerialPort->setDataTerminalReady(true);
}
QString strMsg = "\n成功打开串口:"
+strSerialName + " "
+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
//发送打开成功信号,用于写log记录
emit signal_MainWindowInfo(strMsg);
}//if_isClosed
else
{
m_pSerialPort->waitForReadyRead(250);
// m_pSerialPort->setDataTerminalReady(true);
}//else_isOpen
return true;
}//AutoInitSerialAndOpen
发送数据:
*//向单片机发送数据
void MachineDescribe::sendInfo( QS*tring info){
QByteArray bWrite = HexStringToByteArray(info);
AutoInitSerialAndOpen();
qint64 qicount = m_pSerialPort->write(bWrite);
qDebug() << "写入数据量:" << qicount;
}//sendInfo()
数据接收:*
//真正的数据接收槽函数
*bool MachineDescribe::slot_ReceiveInfo()
{
QByteArray info = m_pSerialPort->readAll();
if("" == info)
{
return false;
}
m_pSerialPort->clear();
QString strReceive = ByteArrayToHexString(info);
qDebug()<< "收到数据:" << strReceive;
m_qlstrReceive.append(strReceive);
return true;
}//slot_ReceiveInfo
```*
注意:串口的所有初始化,串口名,数据位,校验位,控制流,停止位,波特率,以及信号发送与信号接收的槽连接,都可以初始化一次到位,唯有一句,就是串口在每次信号发送之前都要设值一次的,才是唯一最关键的.