串口通信简介:
串口通信和文件读写类似,用usb链接的,需要处理是byte型的数据。
查看串口:右键我的电脑,属性,设备管理器:COM(如果有接串口就会显示这一栏,没有就不会显示)。
串口通信工具:Serial
Port Utility
必备材料:串口通信协议
流程:
1 查看可用串口的名字:
QStringList SerialPortControl::GetPortName(){
QStringList names;
foreach (QSerialPortInfo info, QSerialPortInfo::availablePorts()) {
names.push_back(info.portName());
}
return names;
}
2 根据串口名字打开串口,并监听是否有数据过来
bool SerialPortControl::OpenPorts(QString main, QString sub,int32_t mainbaud,int32_t subbaud){
if(main.size()==0||sub.size()==0){
return false;
}
if(m_mainport->isOpen()){
m_mainport->close();
}
if(m_subport->isOpen()){
m_subport->close();
}
m_mainport->setPortName(main);
if(!m_mainport->open(QIODevice::ReadWrite)){
qDebug()<<"cannot open main port";
return false;
}
qDebug()<<"open main port";
m_mainport->setBaudRate(mainbaud);
m_mainport->setDataBits(QSerialPort::Data8); //数据位为8位
m_mainport->setStopBits(QSerialPort::OneStop); //一位停止位
connect(m_mainport,SIGNAL(readyRead()),this,SLOT(slot_main_receiveInfo()));
m_subport->setPortName(sub);
qDebug()<<sub;
if(!m_subport->open(QIODevice::ReadWrite)){
qDebug()<<"cannot open sub port";
return false;
}
qDebug()<<"open sub port";
m_subport->setBaudRate(subbaud);
m_subport->setDataBits(QSerialPort::Data8); //数据位为8位
m_subport->setStopBits(QSerialPort::OneStop); //一位停止位
connect(m_mainport,SIGNAL(readyRead()),this,SLOT(slot_sub_receiveInfo()));
return true;
}
3 处理传来的数据
void SerialPortControl::slot_main_receiveInfo(){
QByteArray buf = m_mainport->readAll();
//qDebug()<<buf;
//get correct buf
//deal with buf
}
注:如何处理bytearry,建议使用char ch= buf[0],然后打印等,改变值等,自己玩儿一下,就会比较明白;
4 写数据
QByteArray buf;
buf.resize(3);
buf[0] = 0x5A;
buf[1] = 0x01;
buf[2] = buf[0]^buf[1];
if(-1==m_mainport->write(buf)){
qDebug()<<"write failed";
}
注:写数据的时候,不要连续写,建议至少间隔100ms(可能更低,自己测试)。