2019-10-08 13:18:06 zm694844985 阅读数 19
  • 《C语言基础》 之 第8章 数组

    课程内容:数组的声明、定义(初始化)、数组的赋值、数组在内存中的空间特点、使用 [ ] 访问数组元素、数组元素的指针、数组第一个元素指针的表示方法、数组命令与++、sizeof与数组、数组名总结、函数普通传参回顾、传递数组指针、二维数组。

    3023 人正在学习 去看看 张先凤

嵌入式、单片机等硬件软件开发中,经常会用到结构体或者数组,但是在调试中我们经常会发现数组或者结构体变量的内容莫名其妙的被修改了,首先我们确认的是肯定不是代码中我们本意的修改。

  • 解决方法:
    出现这种问题基本上就是数组或者指针出现溢出导致的,这里的数组或者指针是指代码中所用得到的所有的数组或者指针,这个时候仔细查看哪里使用数组或者指针了,然后确认下哪里出现空指针或者数组索引指到了超过数组定义的范围了,问题一般就可以解决了,基本上大部分都是这个原因。至于有些网友说的堆栈、或者内存溢出的原因很少,因为编译器在对代码进行编译时对这类问题是进行了检查的,一般不需要我们自己做修改。
2010-08-05 22:54:00 Tylerco 阅读数 3627
  • 《C语言基础》 之 第8章 数组

    课程内容:数组的声明、定义(初始化)、数组的赋值、数组在内存中的空间特点、使用 [ ] 访问数组元素、数组元素的指针、数组第一个元素指针的表示方法、数组命令与++、sizeof与数组、数组名总结、函数普通传参回顾、传递数组指针、二维数组。

    3023 人正在学习 去看看 张先凤

   最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用C语言进行编程,在应用程序中是用.net编程。其中有一个要求是电脑一次发送十个数据,单片机里定义一个数组,接收这10个数据。可是在进行检验的过程中却发现接收的数据会移位,比如我从电脑中发送的数据是a,b,c,d,e,f,i,j,k,l.那么理论上我在单片机中定义的数组array[10]应该也是array[10]={a,b,c,d,e,f,i,j,k,l.可实际上却不是这样子的,正真接收的数据是array[10]={l,a,b,c,d,e,f,i,j,k,};也就是移了一位,第十位跑到了第一位,第一位到了第二位。之后的就不会再移位,出现这样的原因是因为单片机在一开机的过程中(按下开关),会发送一位ff,有时候会是其它的数据,不论怎么样就是解决不了,也想过把接收的第一位丢掉,可是结果不理想。我开始在网上找解决的方法,却发现也有人遇到与我的情况一样,网上的版本有好几种(各论坛都你抄我的我抄你的),我都试过,我可以负责任地说,那几种都不行。最让我头大的是一位网友提供方法,却让我浪费了整整一天的时间,他那里口口声声说明了他那种算法可以解决此问题,却最终把我带到了误区。为了让后来的人不再进入些误区,我提供一种我的方法,至少我测试了非常多遍,没有出错过一回。核心的算法是在数据的头和尾都加入一个标致位如你电脑要发送a,b,c,d,e,f,i,j,k,l.,定义头标志位为:@ 尾标志位为:#那们电脑其它要发送12个数据@a,b,c,d,e,f,i,j,k,l.#  但单片机一旦收到@后才真正开始接收数据,到#后停止接收。这种方法能很好解决移位问题。以下是我的源码,仅供参考。

 

功能:从电脑中接收十个数据,再把这十个数据发送回电脑。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
static int count=0;//数组计数
static int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中
int flags;//标志位,用到测试用
char array[10];//数组
char temp;
uchar i, j, flag;
void delay(uint n) //延迟作用,不用解释了吧
{
uint x,y;
for( x = n; x > 0; x--)
for( y = 255; y > 0; y-- );


}
//串口初始化
void serial_init()
{
TMOD = 0x20;
TH1 = 0xfd;  //9600赫兹
TL1 = 0xfd;
TR1 = 1; //开启时间中断

SCON = 0x50;//方式2
SM2 = 1; //可以向cpu请求中断
EA = 1; //开总中断
ES = 1; //开串口中断

void putchar( uchar ch )//发送数据 ,不用解释了吧
{
SBUF = ch;
while( !TI );
TI = 0;
}

void main()
{
 
serial_init();
while(1)
{
delay(500);       
if(flags==1)
{
putchar(array[0]);

putchar(array[1]);//验证测试

putchar(array[2]);

putchar(array[3]);

putchar(array[4]);

putchar(array[5]);

putchar(array[6]);

putchar(array[7]);

putchar(array[8]);

putchar(array[9]);


delay(500);  

}
}
}

void Serial() interrupt 4
{
RI = 0;
temp=SBUF;
if(temp=='@'||begin==1)//如果是@,则接下来的数据都是要接收的,如果begin是1也表示是要接收的
   {

      begin=1;

      if(temp!='@')因为@是标致位,所以我们是要丢弃的
       {

            if(temp!='#')

              {

                array[count]=temp;
                   count++;

               }

             else if(temp=='#')//停止位
                {
                   begin=0;
                   count=0;
                  flags=1;
                }

          }
       }
}

 

这篇文章我是发表在程序员的博客中的(http://blog.csdn.net/Tylerco)因为我不方便直接把我项目中的代码拷贝过来,所以重写了参考例子,也担心会出一些小错误,但通过头尾都加一个标致位的方法绝对错不了。如果有错误,请告诉我,我会亲自再测试一回,及时更新,请其它论坛不要看都不看就转到那里去了,真有错误会使人进入误区的。而那里的错误我却没办法修改。

2017-08-29 12:58:42 photonaaa 阅读数 1565
  • 《C语言基础》 之 第8章 数组

    课程内容:数组的声明、定义(初始化)、数组的赋值、数组在内存中的空间特点、使用 [ ] 访问数组元素、数组元素的指针、数组第一个元素指针的表示方法、数组命令与++、sizeof与数组、数组名总结、函数普通传参回顾、传递数组指针、二维数组。

    3023 人正在学习 去看看 张先凤

单片机C 浮点数转化为字符数组问题

最近遇到个用stm32做科学计算器的项目,遇到很多问题。因为这个计算器还要有其他功能,所以最后留给计算器部分的内存有点少,这就使程序中不能使用atof、printf、sscanf这类不安全的程序(基本一使用就会报Hard Fault),只能自己实现这些转换算法。前面字符数组转double型还好,在最后计算结果double型转显示字符数组的时候,碰到了浮点数误差问题,比如222会转成221.99999999。这包含了浮点数存储问题和编译器的问题,最后还是使用加偏差值的方法来解决。

//偏差值
#define Double_Deviation        -0.00000001
//double转换显示字符数组 数组长度
#define Double2Chars_MaxLenght  17

int Numprc_Double2Int_UnitDigit(double num);
//浮点数转显示字符数组
void Numprc_FtoA(double num, char* str) {
    int exp = 1, loop;
    int pos = 0;
    int temp[Double2Chars_MaxLenght] = {0};
    if (num >= 0.0) {

    } else {
        str[pos++] = '-';
        num = -num;
    }
    while (num >= 10.0) {
        exp ++;
        num /= 10;
    }
    for (loop=0; loop<Double2Chars_MaxLenght; loop++) {
        if (loop == exp) {
            temp[loop] = -2;
            continue;
        }
        temp[loop] = Numprc_Double2Int_UnitDigit(num);
        num -= temp[loop];
        num *= 10.0;
        if (num <= 0) {
            break;
        }
    }
    for (loop = 0; loop<Double2Chars_MaxLenght; loop++) {
        str[pos++] = temp[loop] + '0';
    }
    str[pos] = '\n';//结束符
}
//double转int 只限num小于10
int Numprc_Double2Int_UnitDigit(double num) {
    //考虑到可能存在不同偏差值的情况,所以没优化这段程序
    if ((num < (1.0 + Double_Deviation))) {
        return 0;
    } else if ((num < (2.0 + Double_Deviation))) {
        return 1;
    } else if ((num < (3.0 + Double_Deviation))) {
        return 2;
    } else if ((num < (4.0 + Double_Deviation))) {
        return 3;
    } else if ((num < (5.0 + Double_Deviation))) {
        return 4;
    } else if ((num < (6.0 + Double_Deviation))) {
        return 5;
    } else if ((num < (7.0 + Double_Deviation))) {
        return 6;
    } else if ((num < (8.0 + Double_Deviation))) {
        return 7;
    } else if ((num < (9.0 + Double_Deviation))) {
        return 8;
    } else if ((num < (10.0 + Double_Deviation))) {
        return 9;
    }
    return 0;
}
2018-11-13 18:30:53 qq_40581497 阅读数 150
  • 《C语言基础》 之 第8章 数组

    课程内容:数组的声明、定义(初始化)、数组的赋值、数组在内存中的空间特点、使用 [ ] 访问数组元素、数组元素的指针、数组第一个元素指针的表示方法、数组命令与++、sizeof与数组、数组名总结、函数普通传参回顾、传递数组指针、二维数组。

    3023 人正在学习 去看看 张先凤
  • 单片机基于C语言产生随机数组,可以用作乱序密码锁等一些随机性项目。
#include <stdlib.h>
#include <reg51.h>
uchar idata sui[10]={0,1,2,3,4,5,6,7,8,9};
uchar coda shu[10]={0,1,2,3,4,5,6,7,8,9}
void get_rand(uchar *a,uchar m)
{
    int i,j,t;
		srand(m);
    for(i = 0; i < 10; )
    {
        t = rand()%10;
			for(j=0;j<i;j++)
				if(sui[j]==t) break;
			if(j==i)
				{	*a=t;
					i++;
					a++;
				}
    }
}
void main()
{
	get_rand(sui,t);
	display(shu[sui]);
}

随机数需要引进头文件stdlib.h
指针a指向一个随机数组,此数组可以为空,后面可以用作随机参数。
srand是随机数的播种,需要一个随机参数,如果用常数的话就每次运行程序产生的结果一样的,此参数可以是人为随机按下触发的时间。
i<10就是后面产生一个10个元素数组,%10就是参数范围是在0-9之间,第二个for是遍历,除去重复的元素,最后if是储存元素和移动指针。
代码get_rand(sui,t);中的t是播种参数,至于是什么因人而异,还有display函数也是。
代码仅供参考!!!

2015-12-25 19:02:04 moruifen0418 阅读数 379
  • 《C语言基础》 之 第8章 数组

    课程内容:数组的声明、定义(初始化)、数组的赋值、数组在内存中的空间特点、使用 [ ] 访问数组元素、数组元素的指针、数组第一个元素指针的表示方法、数组命令与++、sizeof与数组、数组名总结、函数普通传参回顾、传递数组指针、二维数组。

    3023 人正在学习 去看看 张先凤
用汇编语言编写,将一个包含10个带符号数的数组分成正数数组和负数数组。代码怎么写?
答案:
double:a(i),b(i),c(i) 
for(i=0,i<9,i++)
{ if a(i) >0,
 b(i)= a(i)
else if a  (i)<0
c(i)=a(i)


室温传感器在20K的时候,单片机脚位是多少?


答案:
用外用表打到对应的阻值档上量一下,若阻值无穷大则说明传感器损坏,                                      
LG3681HT的室温传感器为5K,管温传感器为10K,
格力7053的室温传感器为5K,管温传感器为10K,室外管温传感器为10K,
科龙35N2F的传感器都为20K,
新科的传感器都为10K
长虹现在产品的传感器均为10K的
春兰的是5K的
三菱重工5型柜机:室内外盘管传感器7.5k,
一般情况下,空调的管温和室温传感器的阻值是一样的,可以对比量一下就可以了。目前只有少数几个品牌的空调的管温和室温传感器
的阻值是不一样的,松下就是这样:室温是15K,管温是20K,海信有一款机型的管温70K,室温5K

单片机位数解释

阅读数 934

没有更多推荐了,返回首页