目录
- 前言
- 效果图
- 正文
- 连接串口
- 向串口写入命令
- 举例设置的参数
- ComBox类型
- Int类型
- 总结
前言
这篇文章的主要内容是完成对相机参数这部分的配置。因为这个相机参数这个接口的特殊原因,只能采用串口的形式才能对相机的参数进行设置,所以,需要具备一定的连接串口并使用串口发送信息的知识。话不多说,看代码~
效果图
因为这里的相机没有加光源和镜头,所以整体的效果看起来就是这样。
正文
连接串口
首先,我们当相机创建成功时,我们需要同时也连接上串口,从而让程序能够自动读取硬件上的参数,从而显示出正确的参数。串口的初始化如下:
void MDeviceE2v::InitSerialConfigure()
{m_pSerial->setPortName("COM3");if(m_pSerial->open(QIODevice::ReadWrite)){qint32 baudrate = 9600;m_pSerial->setBaudRate(baudrate);m_pSerial->setDataBits(QSerialPort::Data8);m_pSerial->setParity(QSerialPort::NoParity);m_pSerial->setStopBits(QSerialPort::OneStop);m_pSerial->setFlowControl(QSerialPort::NoFlowControl);}else{QMessageBox::information(NULL, "Error", "The Serial open fail.");qDebug()<<"The Serial open fail";}
}
连接串口,我们需要知道的参数有端口号,波特率,数据位,校验位,停止位。这就需要你提前知道了,可以从供应商那边知道。去网上找有很多这种demo,下一个下来就可以知道大概是怎么回事了。
向串口写入命令
注意,我们向串口写入指令要边写然后马上就读,不然,容易出现读错误的情况,我这里把写命令读串口数据封装成了一个接口函数,如下:
//向串口写命令
QString MDeviceE2v::WriteCmdToSerial(QString cmd)
{//qDebug()<<"MDeviceE2v::WriteCmdToSerial cmd"<<cmd;QByteArray bytes;bytes= (QByteArray)(cmd.toStdString().c_str());bytes.append("\r");QString cmd2 = (QString)bytes;bool reset = true;
RESET_CMD:qint32 nRet = -1;nRet = m_pSerial->write(bytes);//nRet返回实际写入的字节数QByteArray response_data;if(m_pSerial->waitForBytesWritten(3000)){while(m_pSerial->waitForReadyRead(500)){response_data += m_pSerial->readAll();if(response_data.size()>0){reset = false;}}}if(reset==true&&(nRet!=0)){reset = false;goto RESET_CMD;}QString response_dataStr;response_dataStr = QString::fromLocal8Bit(response_data);return response_dataStr;
}
- 接下来对这个函数进行一定的解释,首先,我需要对这个命令做一定的处理,因为文档要求传入的命令需要结尾有一个
\r
。不然,串口是无法识别命令的,所以,你一定要看清楚文档中的命令,有可能要求多一个回车符,多有可能,仔细一点总是没错的。不然,你会浪费很多时间去查问题。 - 然后,我就需要使用
write
这个函数把命令写入串口之中,然后,通过waitForBytesWritten
和waitForReadyRead
这两个命令,产生一定的延时,然后,使用read
去读取串口的命令。 - 最后,最好判断一下是否读到了数据,如果没读到的话,使用goto再写一次,读一次。确保读到你要的命令。
举例设置的参数
我这里基本把文档中给出的参数都给设置了,首先,先声明一下,因为无法得到每个参数前面的名字,所以,我使用让软件去读取xml文档,从而得到我想要的参数的名字。然后,里面的数据再是使用串口去读取。关于读取xml文档,将xml文档解析成不同的节点,就需要你自己去查询资料了,我这里里就不赘述了。我只列举一下,我设置了两个参数。先上代码:
ComBox类型
QString MDeviceE2v::GetOutputMode()
{QString cmd;cmd = "r mode\n";QString OutputMode = WriteCmdToSerial(cmd);qint32 outputModeInt = GetRightNum(OutputMode);switch (outputModeInt) {case 0:return "Medium 4 Outputs 8bits";break;case 1:return "Medium 4 Outputs 12bits";break;case 2:return "Full 8 Outputs 8bits";break;case 3:return "Full Plus 10 Outputs 8bits";break;case 4:return "Medium 4 Outputs 10bits";break;case 5:return "Base 2 Outputs 8bits";break;case 6:return "Base 2 Outputs 10bits";break;case 7:return "Base 2 Outputs 12bits";break;}return "OutputMode Error";
}void MDeviceE2v::SetOutputMode(QString OutputMode)
{qDebug()<<"OutputMode"<<OutputMode;QString cmd;if(OutputMode=="Medium 4 Outputs 8bits"){cmd = "w mode 0\n";}else if(OutputMode=="Medium 4 Outputs 10bits"){cmd = "w mode 4\n";}else if(OutputMode=="Medium 4 Outputs 12bits"){cmd = "w mode 1\n";}else if(OutputMode=="Base 2 Outputs 8bits"){cmd = "w mode 5\n";}else if(OutputMode=="Base 2 Outputs 10bits"){cmd = "w mode 6\n";}else if(OutputMode =="Base 2 Outputs 12bits"){cmd = "w mode 7\n";}else if(OutputMode =="Full 8 Outputs 8bits"){cmd = "w mode 2\n";}else if(OutputMode =="Full Plus 10 Outputs 8bits"){cmd = "w mode 3\n";}else{cmd ="OutputMode error cmd";}QString response_data = WriteCmdToSerial(cmd);if(!response_data.contains("Ok")){qDebug()<<"Error SetOutputMode fail";}
}
这是第一种,你需要写入命令,然后,它的返回值只会是单纯的一个数字,你需要进行一定的转换,从而得到你要的字符串,基本上对这种类型的参数都是这样做的。上面的GetRightNum
这个函数是将得到的字符串做一定的分割,从而得到前面的数字。不然,它的字符串还是比较复杂的,没必要每个参数都写那么同样的几行代码,封装一下即可。
Int类型
这种类型就是使用具体的数字去控制的,这个相对于上面会简单一点,应该不难理解。接下来,上代码:
int MDeviceE2v::GetGain()
{QString cmd;cmd = "r gain\n";QString Gain = WriteCmdToSerial(cmd);int GainInt = GetRightNum(Gain);return GainInt;
}void MDeviceE2v::SetGain(int Gain)
{qDebug()<<"SetGain"<<Gain;QString cmd;QString Gain2 = QString::number(Gain);cmd = "w gain "+Gain2;cmd = cmd.append('\n');qDebug()<<"SetGain cmd"<<cmd;QString response_data = WriteCmdToSerial(cmd);qDebug()<<"SensorMode response_data"<<response_data;if(!response_data.contains("Ok")){qDebug()<<"Error SetGain fail";}
}
上面就是我列举的两种类型了,其实是还有Command型,和Boolean型,但Command型我没使用到,Boolean被我转换成ComBox型了,这就看你自己的操作了。
总结
关于参数的设置基本就完成了,有可能会遇到一些坑,但很多坑我都在文章中讲了,你可能需要细心一点看一下,其他遇到的,百度或谷歌也能解决,不过,最好还是看文档。
如果有需要可以去看看我的另外三篇文章。感谢您的观看~
MIL开发实践(1)——开发环境的设置
MIL开发实践(2)——MIL实时采图
MIL开发实践(3)——MIL触发采图
若有错误,欢迎指出,感谢~