![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 58
你行你上天
专注:智能硬件,信号处理算法,数据挖掘算法,Labview虚拟仪器
展开
-
FreeModbus读/写寄存器小Bug
在STM32F401中移植了FreeModBus,移植教程参考了这里:http://www.openedv.com/thread-64794-1-1.html。采用03、04和06号功能码进行数据读写,发现数据能读出,但数值不对。单独调试串口证明串口正常。断点调试发现,每次读/写都是操作的本来想操作寄存器的下一个。于是,一步步查看协议栈各函数调用关系。终于发现,协议栈的小bug。 以03号功能码调原创 2016-11-10 21:30:02 · 3844 阅读 · 10 评论 -
为什么日志系统普遍用标准错误输出stderr?而不是标准输出stdcout?
因为stderr是不带缓冲的,每个输出都会立即flush。而stdout是行缓冲的,要等到缓冲满了才flush,或者手动调fflush。前者更符合作为日志的需要,不然你程序执行过程中core了,缓冲里的遗言可能就丢了,而丢掉的往往是最接近出问题的地方的。参考:APUE第5.4节 https://www.zhihu.com/question/67629357...原创 2021-02-17 17:14:31 · 1002 阅读 · 0 评论 -
C语言如何不用goto、多处return进行错误处理?
参考:https://www.zhihu.com/question/51668402/answer/126921007do {break;} while(0);Goto不够优雅,对生成代码优化也不友好,实际上多年来关于要不要Goto一直有争论。而多return的问题在于不好做资源释放,前一个初始化分配的资源如果后面有错是要释放的,这样就导致每次出错return时都要小心保证前面的资源...转载 2018-09-18 21:15:39 · 669 阅读 · 0 评论 -
利用strlen和sizeof求取字符串长度注意事项
首先,strlen是函数,sizeof是运算操作符,二者得到的结果类型为size_t,即unsigned int类型。大部分编译程序在编译的时候就把sizeof计算过了,而strlen的结果要在运行的时候才能计算出来。 对于以下语句:char *str1 = "asdfgh";char str2[] = "asdfgh";char str3[8] = {'a', 's',...转载 2018-09-25 11:00:40 · 343 阅读 · 0 评论 -
解决:invalid application of `sizeof' to incomplete type `char[] '错误
最近做一个DIY玩具,遇到的这个问题: 解决:invalid application of sizeof' to incomplete typechar[] ‘错误//a.c文件#include "a.h" char array[]={0XED,0X34,0X40,0X34};//a.h文件#ifndef _A_H#define _A_H#define size (sizeo...转载 2018-11-16 15:21:17 · 7101 阅读 · 0 评论 -
字符串常量不可赋值,字符数组可以
C语言中除了初始化外,给字符串赋值的方法有memcpy、strcpy和sprintf。项目中将使用到的字符串定义为常量,然后试图用sprintf改变它的值,一直失败,后来定义改为字符数组就可以了。代码如下: char *str = "aaaa"; char chArray[] = "aaaa"; sprintf(str,"%s"...原创 2018-11-21 18:12:03 · 2645 阅读 · 0 评论 -
AT指令代码与实现方法(基于C语言)
WiFi、蓝牙、4G等多种通信模块均需使用AT指令进行配置和通信。基于μCOSIII操作系统,写了个AT指令的代码,也可以简单修改后用于裸奔系统。简单介绍一下,完整代码下载链接为:https://download.csdn.net/download/hnxyxiaomeng/108156561、AT配置结构体设计了一个结构体stcATConfig,可以对发送的每个指令分别进行配置。...原创 2018-11-29 10:00:02 · 30917 阅读 · 3 评论 -
在子函数中malloc分配内存和free释放内存的方法(基于C)
1. 子函数malloc分配内存 为了增强程序可读性,有时会在子函数中malloc分配内存。测试了如下三种方法,容易想到的是第一种。事实证明这种也是错误的!#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct _dataStc{ int bu...原创 2018-12-04 18:00:45 · 11087 阅读 · 11 评论 -
基于μCOSiii的AT指令代码和使用方法详解
一、主要思路项目中需要用到AT指令与模块通信,前期写了个不带操作系统的AT指令代码模块。现在需要用μCOSiii操作系统,为了提高代码健壮性,对代码进行了重构。在网上看到RT-Thread中实现了AT组件(https://www.rt-thread.org/document/site/submodules/rtthread-manual-doc/zh/1chapters/14-chapte...原创 2018-12-17 10:34:37 · 1584 阅读 · 1 评论 -
关于嵌入式开发中堆栈的理解
转载自:https://blog.csdn.net/Eric_01230/article/details/86299949 今天去面试,面试官再一次问到了对堆栈的理解这个问题,答的不是太好,在网上又查阅了一些讲的比较清楚的博客,现在来梳理一下内容,以备下次之需。一个由C/C++编译的程序占用的内存包括下列几项:栈区(stack) 堆区(heap)静态区(全局区)常量区代码区它...转载 2019-01-31 14:19:31 · 1023 阅读 · 0 评论 -
浅谈嵌入式 MCU 软件开发之应用工程的堆与栈
转载自:http://huxiongwei.spaces.eepw.com.cn/articles/article/item/136717 内容提要 概述与案例分析1. 嵌入式 C 语言应用工程中堆栈的定义和作用2. 嵌入式 C 语言应用工程的栈大小确定3. 嵌入式 C 语言应用工程的堆栈溢出定义、危害以及应对措施 概述与案例分析过去工作中,我经常遇到客户非...转载 2019-01-31 14:20:29 · 1373 阅读 · 0 评论 -
《程序设计与数据结构》读书笔记1——2.2节结构体相关
结构体定义时需要注意字节对齐的问题,在串口/网络等数据传输时,有时为了传输帧格式设计方便,将帧格式设计为结构体,这时更要注意结构体对齐,防止出现不希望的补零。为保险起见,可在定义结构体时声明结构体为1字节对齐。因为结构体指针比整个结构体小的多,所以需要向函数传递结构体时,最好传递结构体指针,而不是结构体本身。这样在函数调用时,压入堆栈的效率要更高。结构体的成员不仅可以是变量,还可以是函数指针...原创 2019-02-12 17:46:56 · 181 阅读 · 2 评论 -
CC2530学习笔记1——Flash存储器映射的讨论
转载自https://blog.csdn.net/bailyzheng/article/details/7541422 接触了一个月的zigbee,发现对cc2530的存储器映射还不是很熟悉,所以写这篇文章来和各位高手讨论一下,一下大家能指正我一些理解上的错误。本文以CC2530的F256为例,即有256kb的flash存储器和8K的sram存储器 一、CC2530里的四种存储空间...转载 2018-09-03 20:07:48 · 1845 阅读 · 0 评论 -
《面向机器智能的TensorFlow实践》StanfordDog完整修改
以下转载自博客:https://blog.csdn.net/fnhc462354756/article/details/79872994主要是为了备份。当然,他的代码参考了我之前的一篇博客,注释都还没变,哈哈。 《面向机器智能的TensorFlow实践》深入浅出,将tensorflow的很多概念讲的很清楚,很适合tensorflow的初学者学习。该书完整的代码在https://gith...转载 2018-08-09 08:48:49 · 433 阅读 · 1 评论 -
MATLAB小波分解/重构wavedec/waverec函数中L和C的意义
这两天在做用小波阈值法进行信号去噪的问题,需要将信号进行五层小波分解,每进行一层分解时都将该层得到的细节系数CDi进行一次阈值化处理。这可以通过多次调用matlab中的dwt函数来实现。但是,在信号进行重构的过程中遇到了问题。 我原来的想法是,多次调用idwt函数来实现逐层重构。然而,遇到了系数长度不匹配的问题。比如,对于长度为1000点的数据,进行五层小波分解时,各层系数的长度依次是502,原创 2016-11-10 22:09:33 · 28382 阅读 · 5 评论 -
mdk 使用--C99标准的问题
使用stm32f4的一个项目中,不记得从哪里借鉴了一段代码:for (int16_t i = 0 ; i < SIG_N - 1 ; i++){FFT_DataBuf[i] = FFT_DataBuf[i + 1];}别人的工程可以通过编译的,但我的工程里就是不可以,只有将i放在main函数体一开始的地方定义。查阅资料后发现是,上述代码中i的定义方式是c99标准的。C99标准中,变量不用必须在每段代原创 2016-11-10 22:25:19 · 3795 阅读 · 0 评论 -
STM32学习笔记6——向24C02芯片中写入浮点数
方法:用共用体(1)共用体类型定义#define FLOAT_BYTE_NUM 4 //float类型占用字节数//浮点数存储共用体typedef union{ float value; uint8_t byte[FLOAT_BYTE_NUM];} storFloatData;(2)函数定义/*******************************************原创 2016-12-08 22:04:24 · 3987 阅读 · 3 评论 -
STM32学习笔记7——浮点数四舍五入
C 中浮点转换为整型是截断的,直接将后面的小数去掉,而不是四舍五入。 如:uint16_t(12.89)=12,而不是13。 项目中写了个小函数,将浮点数输入后,直接用7段译码管显示,用上述方法转换为整型后发现有显示误差。解决方法如下:1、定义一个四舍五入小数的宏#define ROUND_TO_UINT16(x) ((uint16_t)(x)+0.5)>(x)? ((uint16_t)(x原创 2016-12-09 21:40:48 · 10898 阅读 · 4 评论 -
STM32学习笔记8——串口输出数据丢失问题
项目中采用STM32F103和AD7260进行数据采集。采集后想将数据通过串口逐点输出到上位机,然后查看数据是否正确。AD7260是采用外部中断进行采集的,当AD7260的BUSY输出下降沿后,触发外部中断,这时CPU去采集数据。 串口输出部分,我先是这么做的:在中断中采集数据的后面添加printf(串口已经重定向到printf函数)语句,每采集得到一个点后直接printf输出。上位机用软件Ser原创 2017-01-06 23:17:29 · 9287 阅读 · 2 评论 -
USB键盘鼠标报告描述符解释
这是见到的描述鼠标和键盘描述符最清楚、简洁的文章,转载分享。原文地址:http://blog.sina.com.cn/s/blog_4d295e4901019mjs.html 在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(Report Descriptor)转载 2017-03-14 20:53:53 · 8918 阅读 · 0 评论 -
C8051F380 USB鼠标例程报告描述符修改问题
直接使用F380的USB鼠标例程进行开发,只将数组IN_PACKET修改是不行的,将发现仍然只显示左键。仔细查看报告描述符,发现需要修改报告描述符。原有的报告描述符,摘录部分如下: 0x05, 0x09, // Usage Page (Buttons) 0x19, 0x01,原创 2017-03-14 21:05:31 · 1062 阅读 · 0 评论 -
C8051F没有无法进main函数的解决办法之一
用C8051F040做项目时,本来程序可以正常运行,添加一部分程序后发现无法进入main函数。断点调试发现,在文件STARTUP.A51中,跳转到 LJMP ?C_START 后, 又重新跳回 IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ...原创 2017-06-10 21:49:14 · 2338 阅读 · 0 评论 -
STM32学习笔记9——结构体赋值问题
采用TCP/IP上报采集数据,用结构体的形式建立数据缓冲区。在对结构体整体赋初值(比如帧头之类的可以先赋值)时,发现结构体只能在定义时整体赋初值,而不能在初始化语句中赋。typedef struct{uint32_t frame_head; //帧标志uint16_t frame_len;//帧长stcSystemTime frame_time;//帧时间stcFrameP原创 2017-08-29 10:37:07 · 4930 阅读 · 1 评论 -
自制的轨迹球(鼠标)按键异常问题
用C8051F380开发的轨迹球,有左、中、右三个按键。每次按下任一按键,电脑无响应,需再按下另一按键后,之前的按键才有响应。 经测试,正确的操作姿势应该是:每按下一个键后,上报一次USB信息,松开后再上报一次(即告诉上位机此键已经松开)。 所以,程序里的逻辑应该是:每当按键的状态有变化,就上报一次按键状态。我在程序中是在20ms一次的定时器中断中判断按键是否原创 2017-09-02 17:23:27 · 1611 阅读 · 0 评论 -
STM32学习笔记10——stm32中结构体字节对齐问题
stm32做串口或网络传输数据时,经常需要用结构体定义帧格式。如果按照keil默认的对齐方式(4字节对齐),经常会出现结构体中补零的问题,造成帧格式错误。所以,在定义结构体类型时,最好把结构体对齐方式改为1字节对齐,防止出错。理论和方法见下面转载的文章。转载自:https://www.cnblogs.com/King-Gentleman/p/5297355.html#pragma转载 2017-12-11 18:41:09 · 8446 阅读 · 0 评论 -
STM32学习笔记9——stm32L072 SD卡程序移植记录
项目使用stm32L072,需要将采样的数据保存到SD卡中。SD卡程序参考ST公司的官方STM32L073Z_EVAL开发板的例程。需要修改的地方如下: 1、 修改stm32L073z_eval.h中SPI的管脚配置、AF配置; 2、 官方开发板使用了一片STM32L152CCT6扩展了STM32L073的IO口,并通过I2C接口连接。在SD卡例程中,扩展IO口用于检测SD卡是否连接好。我们原创 2017-12-17 18:40:50 · 3176 阅读 · 0 评论 -
基于STM32F4的小波分解(Mallat算法)程序说明
注:本文是程序的说明和实现思路,代码见:https://download.csdn.net/download/hnxyxiaomeng/10301718一、主要思路 原始信号:OrgSig 信号长度:DWT_SIG_LEN 小波分解层数:N 与MATLAB类似,小波分解后产生2个数组DWT_L和DWT_C,但定义与MATLAB不同。定义如下: DWT_L:[DWT_SIG_LEN,c...原创 2016-11-10 21:42:27 · 9590 阅读 · 3 评论