前述工作:
(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通讯协议解析数据,并绘图。
注:由于小伙伴需要源代码的时间不同,登录邮箱界面太多麻烦,所以建立了一个订阅号,如果有问题或者需要源码,可添加订阅号,留言后会发送源代码或者有任何问题可留言,将积极解决提出的问题。