【海思HI3520之QT开发】-串口通讯实战(五):485传感器数据采集
3875
MacianYuan 2020-08-15 17:29:07
  • 环境:Ubuntu 12.04-64bit
  • 硬件平台:Hi3520D_V100
  • 内核版本:linux-3.0.y
  • Qt版本:qt4.8.6
  • 编译器:arm-hisiv100nptl-linux-gcc
  • 作者:MacianYuan
  • 原文链接:https://www.ebaina.com/articles/140000004248
  • 摘要:
    1. 数据发送(16进制)
    2. 数据解析(16进制)

第一节 数据发送(16进制)

在嵌入式Qt中,经常会在通讯中直接发送和接收16进制的数据,Qt中发送16进制的方法有很多种形式去实现,下面是比较简单的一种实现形式,提供参考:

int SensorAnalysis::get_device_number()
{
     //把需要发送的16进制保存在字节数组中
    QByteArray senddata ;
    senddata[0]=0xff;
    senddata[1]=0xff;
    senddata[2]=0xff;
    senddata[3]=0x55;
    senddata[4]=0x01;
    senddata[5]=0x36;
    senddata[6]=0x00;
    senddata[7]=0xff;
    senddata[8]=0xff;
    senddata[9]=0xff;
    //设置485芯片为发送模式
    HI_MPI_SYS_SetReg(0x200F004C,0);
    HI_MPI_SYS_SetReg(0x201A0400,1);
    HI_MPI_SYS_SetReg(0x201A0004,1);
    //把数据通过串口发送函数 发送出去
    WriteCom(Device_public::sensor_port,senddata);
    //短暂的延时处理
    QElapsedTimer t;
    t.start();
    while(t.elapsed()<20);
    //把485芯片设置为接收模式
    HI_MPI_SYS_SetReg(0x200F004C,0);
    HI_MPI_SYS_SetReg(0x201A0400,1);
    HI_MPI_SYS_SetReg(0x201A0004,0);

    return 0;
}
//串口发送函数
int SensorAnalysis::WriteCom(QextSerialPort *write_com, QByteArray data)
{
    if(write_com == 0  || !write_com->isOpen()){
        qDebug() << "The write_com Open Failed!";
        return -1;
    }
    if(write_com->write(data) <= 0){
        //QMessageBox::information(0,tr("错误"),tr("通讯中断"),QMessageBox::Ok);
        write_com->close();
        return -1;
    }
    return 0;
}

第二节 接收数据(16进制)

与普通串口相同的读函数,在完成定时接收整个数据包之后接收的数据通过toHex(),可直接将接收的字符数组转换为16进制的字节数组,通过at()定位到相应数据进行解析。

//读数据 对数据进行解析,定时100ms的数据
void SensorAnalysis::ReadCom()
{
    //开始接受下面100ms的数据
    timer->start();
    baRcvData.append(Device_public::sensor_port->readAll());
}

//读数据 对数据进行解析
void SensorAnalysis::on_timeout()
{
    QByteArray array;
    qDebug()<<"baRcvData timer->stop";
    timer->stop();
    qDebug()<<"baRcvData.length()"<<baRcvData.length();
    if(baRcvData.length()!=0)
    {
        qDebug()<<baRcvData.toHex().at(0);
        qDebug()<<baRcvData.toHex().at(2);
        qDebug()<<baRcvData.toHex().at(4);
    }
    baRcvData.clear();
}

串口通信遇到问题解决方法:

在初学嵌入式Qt的使用中,多会遇到一些比较简单但是因为在windows环境下不会出现的问题,可以通过下面链接找到方法。

1、在文件系统/dev/中查找不到串口设备文件

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核

2、QT5中,串口通信是借助一个QSerialPort的对象来实现的,在Qt4中我们通常借助qextserialport第三方库实现

【海思HI3520之QT开发】-串口通讯实战(二):串口通讯之TTL通讯

3、串口通信数据接收不完整的解决方法

【海思HI3520之QT开发】-串口通讯实战(三):泰斗N303-3数据采集

4、Qt中访问内存地址或寄存器地址,操作GPIO的方法

【海思HI3520之QT开发】-串口通讯实战(四):串口通讯之485通讯

5、Qt关于16进制数据收发方法

【海思HI3520之QT开发】-串口通讯实战(五):485传感器数据采集

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 3 4 评论 打赏
评论
0个
时间排序
内容存在敏感词
手气红包
    0 条记录 第 0 /
    相关专栏
    置顶时间设置
    结束时间
    删除原因
    • 广告/SPAM
    • 恶意灌水
    • 违规内容
    • 文不对题
    • 重复发帖
    打赏作者
    易百纳技术社区
    MacianYuan
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    每周任务
      去完成
      活动规则
      易百纳技术社区
      升级提醒
      升级

      恭喜您的社区称号由 升级为 “社区游民”

      同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

      升级提醒
      易百纳技术社区

      惊喜礼包

      拼手气红包 红包规则
      祝福语
      恭喜发财,大吉大利!
      红包金额
      红包最小金额不能低于5元
      红包数量
      红包数量范围10~50个
      余额支付
      当前余额:
      可前往问答、专栏板块获取收益 去获取
      取 消 确 定

      小包子的红包

      恭喜发财,大吉大利

      已领取20/40,共1.6元 红包规则

        avatar