BM设置过程

整体的思路就是,

  1. 先打开设备,devic.getDeviceId()这个是已经初始化后的设备id

  2. 创建缓存

  3. 启动bm,一开始的过滤就设置的31RT地址

  4. 开启线程不断抓取

  5. 期间设置不同的过滤规则

  6. 关闭的后清缓存,

下面是初始化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);
 }
 ​

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值