我在用指针来接收串口数据时遇到了卡死现象!
uint8_t buf=0;
uint8_t *sbuf=0;
串口中断中下面代码:
buf=USART_ReceiveData(USART1); *(sbuf++)=buf;
每次都卡死在 *(sbuf++)=buf; 这一句!
不知道卡住的原因是什么,如何才能用指针接收多字节数据呢?有谁提供程序!
你的指针都没有正确初始化,地址0肯定不是串口数据地址。
正确的应该是
#define BUFFMAX 1024
uint8_t bufint[ BUFFMAX ]={0};
uint8_t *sbuf= bufint ;
定义的*sbuf=0这个不对,需要指向一个数组,这个数组用来存放接收到的数据。
指针的定义不严谨,指针在定义的同时或者在使用之前必须进行内存分配或者指向已经分配好的内存地址。
uint8_t *sbuf=0; 这样定义的指针sbuf指向了地址0,这个地址并不是有效的内存地址,所以这样使用程序肯定会卡死。
指针在定义好之后,通常是通过malloc动态分配的,在单片机中,更常用的方式是定义指针的同时把指针指向数组的地址,
比如
uint8_t buff[200];
uint8_t *sbuf=buff;
这样sbuf指针才能指向一块有效的内存地址。
你这种设置会把指针地址指向0 肯定会出错
正常要指向数组地址首地址
是因为的指针指向的地址是地址 0 ,导致了死机
可以定义一个数组 uint8_t Buf[8];
uint8_t *sbuf = Buf;让指针指向Buf[]的地址就好了
使用指针之前都是需要设置指针地址的,你这样写就相当与内存越界。可以定义一个数组,uint8_t Buff【100】 = {0};uint8_t *p=buff;
或者你就直接用数组接收,
你这里将指针指向的位置放到0x0那里,那个地方不是RAM的区域,相当于将值放到一块不合法的内存区域,这种肯定会出现内存错误的
这里正确的做法是将uint8_t *sbuf=0;改为uint8_t sbuf[x]={0};
这样编译器会给sbuf分配一个合法的内存地址,然后这个区域的长度x可以根据你的需要进行修改