基于QT的CAN通讯数据实时波形显示(连载四)----阶段一========“CAN帧的表格显示和保存”

前述工作:

    (1)CAN帧可以正确接收并以十进制的形式显示到制表位中,并可以保存,虽然保存过程时间很长,基本功能可以实现。

    (2)timer进程参数设置为100,即100ms执行一次receive函数。同时receive函数里面的参数设置为300,观察到每次receivenum会逐次增加并靠近300,最后等于300。

    (3)其中输出格式如下。其中第一列的计数列是系统自动添加。

第一部分:美化制表位

    美化制表位分为三步:第一步:数据居中或者靠右,毕竟靠左不太好看;第二步:数据转化为十六进制,符合程序员的口味,看着舒服;第三步:左侧的计算列能不能自己生成,将系统产生的去掉。

第一步:靠右,加入效果可以试试,反正就是堆积代码,随便看看就好。

    ui->MESSAGE->horizontalHeader()->setStretchLastSection(true);
    ui->MESSAGE->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->MESSAGE->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->MESSAGE->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(0,0,0);color: white;}");
    ui->MESSAGE->setShowGrid(true);
    ui->MESSAGE->setStyleSheet("QTableWidget::Item{border:0px solid rgb(255,255,255);"
                                           "border-bottom:1px solid rgb(227,23,13);}");

   第二步:数据从十进制变为十六进制显示。

    (1)第一种方法:代码如下

QString strCANID   = QString::number(CANID,16);

    此种方法可以变为16进制,不过弊端在于出现0的时候,本来应该显示为char的数据类型,即:FF型;但是数据出现0时,不是显示00,而是显示0。所以看着很别扭。换另一种方法。

    (2)第二种方法:代码如下

#include <QLatin1Char>

QString strData0 = QString("%1").arg(Data[0], 2, 16, QLatin1Char('0'));

    自己添加头文件,然后调用这句话,就可以在数据等于十进制0的时候转化为十六进制00了。其中2是代表00两位,如果改成4,就变成了0000。其中16是十六进制。后面的函数QLatin1Char为不足位时加0,这个函数可以解决0转化时不足00的问题。

    这里引用鲁迅的话“我从来不以最坏的恶意推测中国人”,但是有些人就是有点问题。写东西就好好写,后生攻城狮会感激你,能奉献出自己一句一句编写的代码。写代码的时候非得花坏一下,QLatin1Char函数中间的1,是数字1,非得改成l,也就是L的小写,一个是数字一个是字母。绕个弯弯干啥,不想让别人知道就别去写,想写了就好好去写,让大家都能去借鉴。鄙视下这些人!至于公司的代码规则,大家都懂,只能自己看懂就行。但是放在网上,就不能摒弃这些东西,费劲吧啦写的,还得去查查是1还是l。当然也可能是我浏览器复制的时候问题。

第三步:系统生成的左侧计数栏去掉。

    QHeaderView* headerView = ui->MESSAGE->verticalHeader();
    headerView->setHidden(true);

    插入以上代码就可以去掉了,然后自己创造一个栏,去显示多少行。这个效果也挺好。并且制表位里面的内容宽度不会动。用系统生产的计数的栏的宽度会随着计数的大小变化,造成自己的栏的长度和位置也相应变动,看着挺不美观。

    注:去掉系统产生的计数栏后,一个意想不到的问题出现。receive函数的receivenum出现了变动,以前随着can帧的接收变逐渐变成300,现在竟然不增加了。下位机传输的can帧10ms一次,一次5帧,定时器100ms,差不多一次需要接收50帧左右,现在去掉计数栏后,receivenum停留在50到60之间。觉这个才是程序应该接收到数据。应该是对的。前面介绍的receive函数的情况,感觉就有点问题,不应该随意变化,而设置的300也应该是最大数才对。初步估计原因:程序添加计数栏时,消耗太多时间,导致timer计数器紊乱或者延后,导致can帧大量放入缓存中,所以就出现逼近300的情况。不过QT设计者也挺厉害,不管处理时间多长,都能把接收到的can帧给你缓存起来,让你慢慢的去取,不出现丢帧现象(上限缓存没有试验,不知道多少,最好不达到最大值,不去让系统缓存)。

第二部分:验证

    制表位中可以看出,计数栏添加没问题,ID是十进制20,十六进制14没问题,显示正确。同时计数栏靠左,数据栏靠右没问题,显示正确。十六进制数据显示正确。

阶段总结和展望

(1)总结

    从添加头文件,dll库函数,到编写程序,到验证程序,一共一周时间,初步完成can帧的正确接收和显示。

    当初的不懂dll库的恐惧已经消失,慢慢的变成了熟悉工种。从恐慌区慢慢过渡到舒适区,慢慢的不想去接触新的知识,不想学习新的知识,学着挺痛苦,同时学完的成就感也不是很强。希望所有的攻城狮功能怀着初心,去学习更多感兴趣的知识,共享更多的代码。如需要串口和can的完整的代码请留下邮箱,会第一时间发送。

(2)展望

    第一阶段完成,可以正确接收can数据并显示十六进制。接收到的数据仅仅是显示到制表位上,需要进一步解析出每个量的数值,并绘图。由于每次can接收到的帧数不固定,55个左右。所以必须处理接收到的帧,并根据can帧的通讯协议,一个一个的提出出来并绘图。下面的阶段即为:根据can通讯协议解析数据,并绘图。

    注:由于小伙伴需要源代码的时间不同,登录邮箱界面太多麻烦,所以建立了一个订阅号,如果有问题或者需要源码,可添加订阅号,留言后会发送源代码或者有任何问题可留言,将积极解决提出的问题。

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值