![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程技巧
文章平均质量分 73
收集各种编程技巧,减少bug
勇往直前996
内在清醒,行所当行,敢做就能赢。
展开
-
Ubuntu16.04安装VS Code中文化及创建快捷方式
帮助你在 Ubuntu 16.04 上将 Visual Studio Code 的快捷方式放到桌面。原创 2023-05-26 14:38:00 · 1836 阅读 · 0 评论 -
Qt应用重启
重启应用程序是一种常见的操作,在Qt中实现非常简单,需要用到QProcess类一个静态方法。转载 2022-09-15 14:09:43 · 2170 阅读 · 2 评论 -
ANSI是什么编码?
用Notepad++创建一个文本文件text.txt,其默认编码格式为ANSI(乍看之下,还以为是ASCII呢),输入汉字居然不是乱码:保存为test.txt,发送给你美国的同事Bob。他也用Notepad++,不幸的是,却发现你的文件内容是这样的:也许你会认为:你用的是中文系统,能正常显示中文;他用的是英文系统,不能显示中文!这么想,好像很有道理呢!但是再细想一下:一个系统显示乱码,说明它不支持这种编码格式(或者解码方式不对)。难道英文系统不支持ANSI?难道ANSI是一种中文编码?如果你身边有一个韩文系转载 2022-06-12 18:54:42 · 3673 阅读 · 0 评论 -
线程局部存储
在多线程术语中,经常听到一个词就是“线程局部存储”,英文Thread-local storage,简称TLS。我们今天就来看看这到底是一个什么样的神秘东西。1 在讲解之前,我们先来看一个例子#include <QDebug>int invoke_count =0; // 用来记录调用common_function函数的次数void common_function (){ ++ invoke_count; //...}void print转载 2022-03-01 10:30:31 · 392 阅读 · 0 评论 -
嵌入式Linux系统脚本小技巧---启动脚本
这里介绍一个小技巧,在系统启动时,预留一个启动脚本,在需要临时修改一些系统配置或者额外启动程序时比较方便。这个方法主要针对只读文件系统,如果是可读写的文件系统则不需要了,可读写的文件系统可以随时修改。我们都知道一般嵌入式Linux系统启动脚本是/etc/init.d/rcS,我们的应用程序启动入口也是在这个脚本里添加,一般会在这里添加一个应用程序的启动脚本,最好不要再这里直接添加启动程序,这样便于后期应用程序启动脚本的修改,而不再需要修改文件系统里的脚本。现在在系统启动脚本rcS里添加一个应用程转载 2022-02-21 17:02:41 · 630 阅读 · 0 评论 -
一个极简的log模块
一个极简的log模块:log颜色可设置、带时间戳、文件、行号、函数,这个log模块仅包含log.h与log.c两个文件。1.log模块代码log.h:#ifndef LOG_H#define LOG_H#ifdef __cplusplusextern "C" {#endif#define LOG_BUF_SIZE 1024typedef long long (*get_sys_time_ms_def)(void);enum log_color{ COLOR_NU转载 2022-02-17 17:32:19 · 231 阅读 · 0 评论 -
Makefile模板
1.写在前面 对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。Linux下也可以实现“一键编译”功能,此时需要一个编译脚本“Makefile”,Makefile可以手动编写,也可以借助自动化构建工具(如sc转载 2022-02-16 13:41:12 · 1988 阅读 · 0 评论 -
分享几个实用的嵌入式C程序
1、十六进制字符转整型数字功能:将16进制的字符串转换为10进制的数字。我是没有找到相应的库函数,所以参考网上的代码自己手动写了个函数来实现。常用的函数有atoi,atol,他们都是将10进制的数字字符串转换为int或是long类型,所以在有些情况下不适用。/*=============================================================================# FileName: hex2dec.cpp# De转载 2022-02-15 13:27:59 · 1351 阅读 · 0 评论 -
scanf,sscanf高级用法
最近遇到了解析配置的问题,用正规表达式感觉大题小做,使用sscanf因只会用基本用法,感觉功能不够,上网搜了下,解析起来不费吹灰之力,代码也很简洁。名称:sscanf() - 从一个字符串中读取与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似..转载 2021-12-30 14:24:57 · 287 阅读 · 0 评论 -
常见的校验算法
UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息。在自定义数据存储时,有经验的工程师都会添加一定校验信息。你平时通信或者数据存储时,有用到校验信息吗?下面就介绍几种常见的校验算法。一、校验和校验和是最基本,也是嵌入式工程师最常用的一种校验算法,其实现方法很简单,简单到只有几行代码。实现的方式方法很多,不同的编程语言,不同的应用有所不同,下面以C语言8位校验和为例:uint8_t CheckSum(uint8_t *Buf,转载 2021-11-30 13:06:52 · 1018 阅读 · 0 评论 -
Linux C TCP通讯——可直接用于实际项目开发
TCP通讯代码demo:int is_valid_IP(const char *ipstr) { if (!ipstr) return 0; int a, b, c, d; int tmp = sscanf(ipstr, "%d.%d.%d.%d", &a, &b, &c, &d); if (4 != tmp) return 0; if (!(0 > a || 255 < a || 0 > b || 255 < b ||.原创 2021-11-23 10:55:23 · 1248 阅读 · 0 评论 -
protobuf-c之嵌入式平台使用
什么是protobuf-c之前的文章:《Protobuf:一种更小、更快、更高效的协议》详细介绍了protobuf及protobuf-c。这里再简单提一下:Protocol Buffers,是Google公司开发的一种数据格式,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。protobuf支持一些主流的语言,唯独没有支持C,所以诞生了第三方的protobuf-c。之前文章介绍了protobuf、protobuf-c在PC平台上的安装及使用,本篇笔记我们来把它用在我们的嵌入式转载 2021-11-16 18:13:26 · 1201 阅读 · 0 评论 -
Protobuf:一种更小、更快、更高效的协议
前言之前分享关于JSON的使用:例说嵌入式实用知识之JSON数据。JSON类型数据可读性很好,但是整个数据包中会带有一些无用的数据,会在一定程度上带来通信负担。本篇文章我们来分享一种更轻量的数据格式——protobuf。protobuf的优点: 更小、更快、更简单。 支持多种编程语言 。 解析速度快。 可扩展性强。 什么是protobuf、protobuf-c?Protocol Buffers,是Google公司开发的一种数据格式,类似于XML能够将结转载 2021-11-16 18:09:14 · 645 阅读 · 1 评论 -
C语言常用转换函数实现原理
编程时,经常用到进制转换、字符转换。比如软件界面输入的数字字符串,如何将字符串处理成数字呢?今天就和大家分享一下。1、字符串转十六进制:void StrToHex(char *pbDest, char *pbSrc, int nLen){ char h1,h2; char s1,s2; int i; for (i=0; i<nLen/2; i++) { h1 = pbSrc[2*i]; h2 = pbSrc[2*i+1];转载 2021-11-08 10:30:20 · 365 阅读 · 0 评论 -
如何理解互斥锁、条件变量、读写锁以及自旋锁?
锁是一个常见的同步概念,我们都听说过加锁(lock)或者解锁(unlock),当然学术一点的说法是获取(acquire)和释放(release)。恰好pthread包含这几种锁的API,而C++11只包含其中的部分。接下来我主要通过pthread的API来展开本文。mutex(互斥量)mutex(mutual exclusive)即互斥量(互斥体)。也便是常说的互斥锁。尽管名称不含lock,但是称之为锁,也是没有太大问题的。mutex无疑是最常见的多线程同步方式。其思想简单粗暴,多线程共转载 2021-10-27 12:54:14 · 213 阅读 · 0 评论 -
Qt之QFuture
QFuture 类代表一个异步计算的结果。要启动一个计算,使用Qt之Concurrent框架中的 APIs 之一。QFuture 允许线程与一个或多个结果同步,这些结果将在稍后的时间点准备就绪,该结果可以是具有默认构造函数和拷贝构造函数的任何类型。如果一个结果在调用 result()、resultAt() 或 results() 函数时不可用,QFuture 将进行等待,直到结果可用为止,使用 isResultReadyAt() 函数可以检测结果是否已准备就绪。进度信息由 progressV..转载 2021-10-21 17:54:26 · 735 阅读 · 0 评论 -
Qt中使用gif动图加载大量数据
这篇文章的主要内容是:点击一个widget页面时,当加载的数据量过大时,会造成假死状态。此时使用gif动态加载图表示当前加载的状态。目前我使用的开发环境是:VS2017+QT5.14.2肯定有人觉得怎么用这么个怪异的开发环境,使用QT语言为啥不直接使用QtCreator呢?我只能说工作需要,哈哈。接下来我们主要讲解我需要实现的功能实现的功能是:点击父窗口的按钮,进入子窗口Dlg1中,并在子窗口Dlg1中加载数据,在加载数据的同时显示gif等待图片这个功能看着很简单,其实存在了以下几个难点转载 2021-10-21 17:47:38 · 795 阅读 · 0 评论 -
一文详解 C++ 日志框架
1、日志框架日志框架一个经过专门设计的实用程序,用于规范应用程序的日志记录过程。日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplus)提供。对于不同的日志框架,各自在实现方式上也有所不同。虽然可以简单地“标准化”日志(例如:调用文件系统 API,将信息写入名为 log.txt 的文件),但是要成为一个严格意义上的框架,必须要超越标准化。也就是说,日志框架必须通过处理日志记录来标准化解决方案,从而暴露一个标准的 API。没明白?那就再具体一些,设想一个日志框.转载 2021-09-29 13:26:13 · 1215 阅读 · 1 评论 -
C语言指针:指针作为形参如何改变其指向的地址?
题目是什么意思呢?就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需要编写一个函数 输入参数是一个指针a,需要通过该函数将该指针a指向数组b,即:int b[3] = {1,2,3};void fcn(参数);void main(){ int* a; fcn(输入参数a)}执行完fcn后,使参数的地址改变,这个功能怎么来实现呢?首先说明结论:使用二级指针。为了更好的理解这个问题,我们首先来学习一下指针最经典转载 2021-09-29 13:05:20 · 1923 阅读 · 0 评论 -
GCC 参数记录
gcc/g++的简单操作已经用过多次, 但是有时稍微复杂一点的程序就会使用到库。在遇到问题的时候我查了挺多前辈总结的资料,也留个脚本希望对朋友们有个帮助。例如:libz.sog++ -o compress compress.cpp -I/home/include/ -L/lib/ -lz1、(1) -I (大写i)编译程序按照-I指定的路进去搜索头文件。-I/home/include/表示将-I/home/include/目录作为第一个寻找头文件的目录,寻找的顺序是:...转载 2021-09-01 17:38:30 · 102 阅读 · 0 评论 -
创建数据库链接sqlite3_open用法
sqlite3_open用法:原型:int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */);用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,比如:E:/test.db。文件名不需要一定存在,如果此文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件来打开。转载 2021-03-11 10:13:03 · 1952 阅读 · 0 评论 -
#include使用引号“”和尖括号<>的区别
很多程序员写代码,可能没有仔细研究过#include相关的内容,下面就来简单说说。1、关于#include首先,#include为预处理语句,那么什么是预处理语句呢?预处理语句最明显的标志是一些行首以#开始的特殊语句。例如:#include、 #define、#if等就是预处理语句。在程序的其它编译处理(词法分析、语法分析、代码生成、优化和连接等)之前,先进行这些语句的分析处理。在编译工具中,有一个叫预处理器,预处理器发现 #include 指令后,就会进行一些预处理操作。...转载 2021-03-08 12:45:32 · 936 阅读 · 0 评论 -
心跳包机制设计详解
存在下面两种情形:情形一:一个客户端连接服务器以后,如果长期没有和服务器有数据来往,可能会被防火墙程序关闭连接,有时候我们并不想要被关闭连接。例如,对于一个即时通讯软件,如果服务器没有消息时,我们确实不会和服务器有任何数据交换,但是如果连接被关闭了,有新消息来时,我们再也没法收到了,这就违背了“即时通讯”的设计要求。情形二:通常情况下,服务器与某个客户端一般不是位于同一个网络,其之间可能经过数个路由器和交换机,如果其中某个必经路由器或者交换器出现了故障,并且一段时间内没有恢复,导致这之间的链路不再畅转载 2021-03-04 12:54:14 · 1600 阅读 · 2 评论 -
减少80%非业务bug的16个好习惯
前言每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈。github地址:❝https://github.com/whx123/JavaHome1. 修改完代码,记得自测一下「改完代码,自测一下」是每位程序员必备的基本素养。尤其不要抱有这种侥幸「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。2. 方法入参尽量都检验.转载 2021-02-08 12:49:12 · 135 阅读 · 0 评论