整体的思路就是,
-
先打开设备,
devic.getDeviceId()
这个是已经初始化后的设备id -
创建缓存
-
启动bm,一开始的过滤就设置的31RT地址
-
开启线程不断抓取
-
期间设置不同的过滤规则
-
关闭的后清缓存,
下面是初始化bm的。 初始化bm后开了一个线程BusMonitorDataReadThread,不断的去读数据
// status = boardCom.bmFilter(devic.getDeviceId(), 1, 0XFFFFFFFF, 0XFFFFFFFF);
//这是刚开始的设置了一个过滤
status = boardCom.bmFilter(devic.getDeviceId(), 31, 0XFFFFFFFF, 0XFFFFFFFF);
LogSingleTon::getInstance()->bmMsgLog("过滤设置参数" + QString::fromStdString(ADT_L1_Error_to_String(status)));
if(status == ADT_SUCCESS) {///>设置过滤器成功
//设置BM捕获内存,READ_MSGS_NUM为开辟的总线消息缓存
status = boardCom.bmBufferSet(devic.getDeviceId(), READ_MSGS_NUM);
if(status == ADT_SUCCESS) {///>内存开辟成功
//启动BM功能
status = boardCom.bmStart(devic.getDeviceId(), true);
if(status == ADT_SUCCESS) {
//创建一个线程,并开始抓取,这是直接抓取的bm 中cdp的线程,READ_MSGS_NUM1000个
BusMonitorDataReadThread *readDataThread = new BusMonitorDataReadThread(devic.getDeviceId(), READ_MSGS_NUM);
connect(this, SIGNAL(stopReadData()), readDataThread, SLOT(recControlStopSignal()));
connect(readDataThread, SIGNAL(bmDataReadThreadGenInfor(QString)), this, SLOT(recBmInfor(QString)));
readDataThread->begin();///>线程开始
//界面使能
ui->stopBM->setEnabled(true);
ui->start->setEnabled(false);
} else {
msgs = "BM 启动失败";
msgs += ADT_L1_Error_to_String(status);
LogSingleTon::getInstance()->errorOutPut(msgs);
}
} else {
msgs = "BM 内存分配失败";
msgs += ADT_L1_Error_to_String(status);
LogSingleTon::getInstance()->errorOutPut(msgs);
}
} else {
msgs = "BM 设置过滤器失败";
msgs += ADT_L1_Error_to_String(status);
LogSingleTon::getInstance()->errorOutPut(msgs);
}
线程代码如下:主要功能就是去读消息然后处理
ADT_L0_UINT32 status;
ADT_L0_UINT32 numMsgs;///>读取的实际消息数量
BaordCommon boardCom;
// ADT_L1_1553_CDP bmMessages[20];
ADT_L1_1553_CDP bmMessages[1000];
//循环获取数据
while (!stopped) {
if(!paused) {///>线程处理
//读取消息
status = boardCom.bmReadNewMsgs(deviceId, msgNums, &numMsgs, bmMessages);
if(status == ADT_SUCCESS) {
QFuture<void>w = QtConcurrent::run([ = ]() {
QString msgInfo;
// qDebug() << "BM数据读取" << numMsgs;
/* BM抓取的数据展示 */
for (uint i = 0; i < numMsgs; i++) {
/* 展示基本的消息 */
if(bmMessages[i].STS1info != 0xffffffff) {
msgInfo.clear();
msgInfo += " 消息计数:" + convert.intToBigEndianByteArray(QString::number(bmMessages[i].BMCount).toInt()).toHex();
msgInfo += " 时间高位:" + convert.intToBigEndianByteArray(QString::number(bmMessages[i].TimeHigh).toInt()).toHex().toUpper();
// msgInfo += " 时间低位:" + convert.intToBigEndianByteArray(QString::number(bmMessages[i].TimeLow).toInt()).toHex().toUpper();
msgInfo += " 时间低位:" + QString::number((bmMessages[i].TimeLow * 20) / 1000000);
msgInfo += " 消息间隔:" + QString::number(bmMessages[i].IMGap / 100) + QString("\n"); ///>100ns的间隔
msgInfo += " CMD1: " + convert.intToBigEndianByteArray(QString::number(bmMessages[i].CMD1info & 0xFFFF).toInt()).toHex().toUpper();
msgInfo += wordPasre.getCommandInfo( bmMessages[i].CMD1info & 0xFFFF);
msgInfo += " STS1: " + convert.intToBigEndianTwoBytes(QString::number(bmMessages[i].STS1info & 0xFFFF).toInt()).toHex().toUpper() + QString(" ");
msgInfo += " CDP状态字: " + convert.intToBigEndianTwoBytes(QString::number(bmMessages[i].CDPStatusWord & 0xFFFFFFFF).toInt()).toHex().toUpper() + QString("\n");
for (int j = 0; j < 32; j++) {
msgInfo += convert.formatDislpay( convert.intToBigEndianTwoBytes(bmMessages[i].DATAinfo[j]));
if (!((j + 1) % 8)) msgInfo += "\n";
}
LogSingleTon::getInstance()->bmMsgLog(msgInfo);
emit bmDataReadThreadGenInfor(msgInfo);
}
}
} );
w.waitForFinished();
} else {
emit bmDataReadThreadGenInfor("消息抓取失败");
}
msleep(10);
} else {///>线程暂停
sleep(1);///>休眠1秒
}
}
线程有个函数可以接收设置的过滤信息
代码如下:
void BusMonitorDataReadThread::recFilter(ADT_L0_UINT32 rt, ADT_L0_UINT32 rxFilter, ADT_L0_UINT32 txFilter) {
BaordCommon boardCom;
filterStatus = boardCom.bmFilter(deviceId, rt, rxFilter, txFilter);
}