概述
对于嵌入式调试来说,十六进制发送和接收功能是必不可少的 !在某些时候我们希望软件能够自动添加换行、并且能显示数据的接收时间。当然,我们同样需要有停止显示功能,即在接收的过程中停止显示数据,方便查询历史数据,而不需要改动串口硬件。一键清空发送区、接收区内容当然也是必不可少。
1.功能演示
2.十六进制发送功能实现
step1:在发送槽函数中判断软件界面是否选中,以及是否需要发送换行符,从而实现十六进制功能,代码如下
/***********************************************************
*发送按钮槽函数
* 1.读取发送窗口数据
* 2.判断发送格式,并格式化数据
* 2.1 十六进制发送,是否添加新行
* 2.2 文本发送,是否添加新行
* 3.发送串口数据
* 4.统计发送流量,并显示在状态栏
***********************************************************/
void MainWindow::on_pushButtonSend_clicked()
{
QByteArray ComSendData;
QString SendTemp;
int temp;
//读取发送窗口数据
SendTemp = ui->TextSend->toPlainText();
//判断发送格式,并格式化数据
if(ui->checkBoxSendHex->checkState() != false)//16进制发送
{
if(ui->checkBoxAddNewShift->checkState() != false)
{
SendTemp.append("0D0A");// 后面添加换行
}
ComSendData = QByteArray::fromHex(SendTemp.toUtf8()).data();//获取字符串
}
else //字符串形式发送
{
if(ui->checkBoxAddNewShift->checkState() != false)
{
SendTemp.append("rn");// 后面添加换行
}
ComSendData = SendTemp.toLocal8Bit().data();//获取字符串
}
//发送数据
temp = MyCom.write(ComSendData);
//统计发送流量,并显示在状态栏
if(temp)
{
ComSendSum +=temp;//发送总数统计
setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);// 状态栏显示计数值
}
}
step2: 接收数据槽函数中判断软件界面是否选中了十六机制、接收时间显示,并进行相应处理,代码如下
/***********************************************************
*串口接收槽函数
* 1.接收数据,并显示在接收窗口
* 2.显示过程中需要判断:
* 2.1 是否需要16进制显示
* 2.2 是否需要显示时间
* 2.3 是否停止显示
***********************************************************/
void MainWindow::MyComRevSlot()
{
QByteArray MyComRevBUff;//接收数据缓存
QString StrTemp,StrTemp1,StrTimeDate;
//停止接收延时定时器,读取串口接收到的数据,并格式化数据
recvDelayTimer->stop();
MyComRevBUff = MyCom.readAll();
StrTemp = QString::fromLocal8Bit(MyComRevBUff);
//接收流量统计,并显示到状态栏
ComRevSum += MyComRevBUff.size();
setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);
//获取串口数据接收的系统时间,备后续使用
curDateTime = QDateTime::currentDateTime();
StrTimeDate = curDateTime.toString("[yyyy-MM-dd hh:mm:ss.zzz] ");
//开始显示数据,显示模式包括:是否16进制,是否显示接收时间
if(ui->checkBoxRevHex->checkState() == false)//正常文本显示
{
if(TimeDateDisp == true)//显示接收时间
{
StrTemp.prepend(StrTimeDate);//前面添加时间
StrTemp.append("rn");//后面添加换行
}
if(StopDis == false)
{
ui->TextRev->insertPlainText(StrTemp);//显示数据
ui->TextRev->moveCursor(QTextCursor::End);//光标移动到文本末尾
}
}
else //16进制显示
{
StrTemp = MyComRevBUff.toHex().toUpper();//转换为16进制数,并大写
for(int i = 0; i<StrTemp.length (); i+=2)//整理字符串,即添加空格
{
StrTemp1 += StrTemp.mid (i,2);
StrTemp1 += " ";
}
if(TimeDateDisp == true)//添加时间显示
{
StrTemp1.prepend(StrTimeDate);//前面添加时间
StrTemp1.append("rn");//后面添加换行
}
if(StopDis == false)
{
ui->TextRev->insertPlainText(StrTemp1);//显示数据
ui->TextRev->moveCursor(QTextCursor::End);//光标移动到文本末尾
}
}
}
step3:清空发送、接收区内容,同时请空流量统计
/***********************************************************
*清空接收区按钮槽函数
* 1.清空接收区
* 2.清空流量统计
***********************************************************/
void MainWindow::on_pushButtonClearRev_clicked()
{
ui->TextRev->clear();
ComSendSum = 0;
ComRevSum = 0;
setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);
setNumOnLabel( qlbRevSum, "Rx: ", ComRevSum);
}
/***********************************************************
*清空发送区按钮槽函数
* 1.清空发送区
* 2.清空流量统计
***********************************************************/
void MainWindow::on_pushButtonClearSend_clicked()
{
ui->TextSend->clear();
ComSendSum = 0;
ComRevSum = 0;
setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);
setNumOnLabel( qlbRevSum, "Rx: ", ComRevSum);
}
/***********************************************************
*接收区停止显示槽函数
* 1.设置停止接收标志位
***********************************************************/
void MainWindow::on_pushButtonStopRev_clicked()
{
if(ui->pushButtonStopRev->text() == "停止显示")
{
ui->pushButtonStopRev->setText("继续显示");
StopDis = true;
}
else
{
ui->pushButtonStopRev->setText("停止显示");
StopDis = false;
}
}
3.小结
完成了一些嵌入式调试的实用功能。