背景:

  在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象。

正文:

  上位机有个函数为check_receive();该函数的作用为定时调用循环检测USB是否有数据。若有,则将信息打印到界面窗体上。界面上有两个QTableWidget窗体

"ui->can1tableWidget与ui->can2tableWidget",根据传上来的的数据某个字节信息为1、或2来打印到对应的窗体上。代码如下:

QTableWidget *canselWidget = NULL;
unsigned int CANSelCnt; if(CANData.CANSel == 1)
{
CANSelCnt = 第1个窗体显示的行数; //伪代码
canselWidget = ui->can1tableWidget ;
}
else if(CANData.CANSel == 2)
{
CANSelCnt = 第2个窗体显示的行数; //伪代码
canselWidget = ui->can2tableWidget ;
}
//接着即使用canselWidget来对界面进行操作。

接着,总会出现,QT上位机界面直接卡死甚至挂掉的问题。观察现象发现,APP在显示数据窗体时即疯狂地新增新的行数。再研究代码,然后将CANSelCnt打印出来,发现其值为一个很大的随机值。

解决方案:CANSelCnt 在定义的时候要初始化!!!

接着运行上位机发现,APP显示数据窗体不再疯狂的新增行数了。可还是出现挂掉的现象!!
进一步调试才发现若是CANData.CANSel的值不是为1、2那会出现什么情况! 就会对canselWideget这个NULL指针进行操作!更改代码如下:

switch(CANData.CANSel)
{
case 1:
CANSelCnt = 第1个窗体显示的行数; //伪代码
canselWidget = ui->can1tableWidget ;
break;
case 2:
CANSelCnt = 第2个窗体显示的行数; //伪代码
canselWidget = ui->can2tableWidget ;
break;
default:
// 防止后续代码对空指针进行操作,直接返回。
return;
}

总结:

1、此处代码写的非常不小心,犯如此低级的错误却花费了1天多的时间(还以为是下位机没配置好!)!下次一定要把握住程序运行的每个通路,杜绝此现象再次发生。

2、由于之前一直在写下位机代码,所以不赋初值的习惯也带入到这里,出了这次惨痛教训!

/* 以下内容,理解还是有偏差,等理解通了,再重开一篇博客来写
* 已重新了一篇博客,名称为"下位机多个".c, .h"文件的相互包含及排版".
* 2016年5月6日
*/

附:

  多个".c"文件包含一个".h"文件处理方法

  在下位机,为何会经常出现不赋初值的情况发生。(应该说是在声明的时候不会赋初值。)

  首先,最重要的是,下位机保存全局变量的区域为掉电易失区域,所以得到的变量值会为默认"0"值,严谨的做法还是会初始化全局变量。

  其次,在多个".c"文件包含一个".h"文件的情况下,若在".h"文件中赋初值,则相当于在其内即声明又定义了,那么编译时,即会出现如下报错:

  keil *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS (报错信息不完整,只挑了重点部分)

  所以说,有多个".c"文件需要包含该".h"文件时,不能进行进行变量的定义,只能进行声明!然后在"main函数"内对其进行初始化操作。

  否则会出现以上错误,即重复定义!

那么多个"c"文件包含一个".h"文件具体该如何操作呢?

  我自己当时的错误想法既是:

  在".h"文件内,声明全局变量、函数,譬如uchar aa;void sum(uchar aa); 然后多个".c"文件#include该".h"文件,结局很显然,重复定义错误跑不掉。

  何不使用 #ifndef #define #endif ?结果证明并没有什么卵用。

  正确的做法是,

  在".c"文件内声明全局变量、函数,譬如uchar aa;void sum(uchar aa);,并在".c"文件内实现该函数。

  然后,在".h"文件,将变量aa,函数void sum(uchar aa);声明为extern,这样,其他".c"包含该".h"文件即不会提示重复定义,也可以调用其内部的函数。

  其实这种做法其实相当于某个需要调用该".c"文件的其他"XXX.c"文件在其文件内 extern 该“.c"文件内实现的函数及定义的变量。若是多个文件需要使用使用,每个".c"文件都需 extern 同样的变量和函数,显然在做重复工作,于是就将它放在一个".h"文件,多个".c"文件需要调用时直接包含该".h"文件就可以实现 extern 了。

记录地点:深圳WZ

记录时间: 2015年12月18日 18:55:57

QT编写上位机程序一定要初始化变量以及谨慎操作指针的更多相关文章

  1. VC++编写简单串口上位机程序

    VC++编写简单串口上位机程序   转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...

  2. vc++MFC开发上位机程序

    用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...

  3. 15-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,上位机程序编写

    https://www.cnblogs.com/yangfengwu/p/11104167.html 先说一下整体思路哈.. 咱滑动的时候 会进入这个,然后咱呢不直接从这个里面写发送 因为这样的话太快 ...

  4. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  5. 转:Qt编写串口通信程序全程图文讲解

    转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...

  6. Qt编写串口通信程序全程图文讲解 .

    在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...

  7. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

  8. Qt 编写多窗口程序

    该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语      程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭 ...

  9. 从软件测试转型到C#上位机程序员

    一直在做软件测试的工作,天天与程序员不依不饶的争论细节的问题,没想到自己也有那么一天走上程序员的道路,由此开始,我的博客天天更新自己的学习状态,分享自己的心得. C#是微软公司发布的一种面向对象的.运 ...

随机推荐

  1. hdu 2010 - 水仙花数

    题意: 数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花 ...

  2. 1 NFS高可用解决方案之DRBD+heartbeat搭建

    preface NFS作为业界常用的共享存储方案,被众多公司采用.我司也不列外,使用NFS作为共享存储,为前端WEB server提供服务,主要存储网页代码以及其他文件. 高可用方案 说道NFS,不得 ...

  3. MooseFs-分布式文件系统系列(三)之MFSclient端的使用

    Web界面监控MFS状态 mfscgiserv 是用python写的一个web服务器,监听端口是9425,必须在master(管理服务器上)上启动 常用的参数如下: | 参数| 作用| |:--| : ...

  4. tomcat并发

    Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的.更好的硬件,更多的处理器都会使Tomcat支持更多的并发. Tomcat默认的HTTP实现是采用阻塞式 ...

  5. xbmc的静态链接办法

    XBMC是一个相当酷的音频/视频播放器,号称家庭影视中心. 我是希望静态将一些库链接进可执行程序的,这样我用的ArchLinux就不用天天在更新一些东西了 但XBMC试了很多次,编译成功后,总是在运行 ...

  6. nginx https性能优化

    影响HTTPS速度的主要原因:秘钥交换算法 常见的密钥交换算法有 RSA,ECDHE,DH,DHE 等算法.它们的特性如下: RSA:算法实现简单,诞生于 1977 年,历史悠久,经过了长时间的破解测 ...

  7. Hibernate学习总结

    首先声明这是个坑爹的框架 属于ssh经典框架中的持久层框架,说白了就是管理数据库的. 下载地址:http://hibernate.org/orm/ 这里写了版本5.2,下载下来的基本不怎么会用,因为文 ...

  8. MySQL数据库常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 不区分大小写 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等 ...

  9. C#中使用DateTimePicker控件显示修改日期时间

    1.只显示日期   默认就是   2.只显示时间   修改属性 Format 设为Time ShowUpDown设为true   3.同时显示日期时间   Format设为Custom CustomF ...

  10. SortedMap接口

    SortedMap接口是排序接口,只要是实现了此接口的子类,都属于排序的子类,TreeMap也是此接口的一个子类. import java.util.Map; import java.util.Sor ...