因手機殼測量工作需要多個小市場多次測量拼接,擬采用位移平臺+標致點的方法,現記錄一些通過Qt5(C++)控制位移平臺的代碼。
源碼下載
鏈接: https://pan.baidu.com/s/1qY7egMS 密碼: 1fxj
Qt5串口通信類
新建Qt工程的時候要勾選Serial Port模塊,如果忘記勾選可以在QT VS TOOL——Qt Project Settings中進行設置。
QSerialPort模塊提供的兩個類:QSerialPort類和QSerialPortInfo類,QSerialPort類提供了對串口的操作,QSerialPortInfo類提供了對串口信息的獲取。
讀取串口信息
//讀取串口信息
foreach?(constQSerialPortInfo?&info,?QSerialPortInfo::availablePorts())
{
qDebug()<<"Name:"<<info.portName();
qDebug()<<"Description:"<<info.description();
qDebug()<<"Manufacturer:"<<info.manufacturer();
}
依據串口信息打開串口
按照zolix說明書中,SC300-2B位移平臺的串口名稱為USB Serial Port,搜索字符串contains("USB Serial Port")的串口,將其打開。
//保存串口
if (t_info.description().contains("USB Serial Port"))
{
m_info = t_info; // 找到需要通信的串口
}
打開串口
//打開串口
m_serial.setPort(m_info);
m_serial.close();//先關閉串口,再打開,可以保證串口不被其他函數占用
if (m_serial.open(QIODevice::ReadWrite))
{
//////////////////////////////////////////////////////////////////////////
//先打開串口才能進行設置
//////////////////////////////////////////////////////////////////////////
//設置波特率
m_serial.setBaudRate(19200);
//設置數據位
m_serial.setDataBits(QSerialPort::Data8);
//設置校驗位
m_serial.setParity(QSerialPort::NoParity);
//設置停止位
m_serial.setStopBits(QSerialPort::OneStop);
}
測試通信正常
m_serial.write("\r");//發送回車測試是否連通
m_serial.waitForReadyRead(3000);
QByteArray readComData = m_serial.readAll();
if(!readComData.isEmpty())
{
readComDataWhole += readComData;//使用類里的一個變量readComDataWhole來存儲返回的數據
if(readComDataWhole.contains("\r"))//如果返回的數據中含有\r,即回車符,則做解析操作
{
qDebug() << readComDataWhole;//對回傳的數據做操作
if(readComDataWhole.contains("OK"))
{
qDebug() << QStringLiteral("設備連接正常!");
}
}
}
發送數據
使用m_serial.write()方法,傳入參數為QByteArray。
回傳數據
使用m_serial.readAll()方法獲得串口數據。
將讀取數據建立一個slots,與m_serial的readyRead()信號相關聯。
connect(&m_serial, SIGNAL(readyRead()), this, SLOT(readComDataSlot()));
回傳數據中出現分段現象:
使用一個readComDataWhole全局變量保存整體的data,如果接受到的數據沒有結束符(在這里使用的是\r),則將數據加到readComDataWhole的尾部,直到有結束符時,認為是一次完整數據接收,做相應的處理。處理完后將readComDataWhole.clear();
//讀取串口數據
QByteArray readComData = m_serial.readAll();
if(!readComData.isEmpty())
{
readComDataWhole += readComData;//使用類里的一個變量readComDataWhole來存儲返回的數據
if (readComDataWhole.contains("\r"))//如果返回的數據中含有\r,即回車符,則做解析操作
{
qDebug() << readComDataWhole;//對回傳的數據做操作
readComDataWhole.clear();//清空緩存
readComData.clear();
}
}