• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

如何用指针来接收串口数据?

hayden 2019-04-03 浏览量:1142

我在用指针来接收串口数据时遇到了卡死现象!


uint8_t buf=0;

uint8_t *sbuf=0;


串口中断中下面代码:

buf=USART_ReceiveData(USART1);
*(sbuf++)=buf;


​每次都卡死在   *(sbuf++)=buf;​  这一句!


不知道卡住的原因是什么,如何才能用指针接收多字节数据呢?有谁提供程序!

1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:10
  • 你的指针都没有正确初始化,地址0肯定不是串口数据地址。

    正确的应该是

    #define BUFFMAX 1024

    uint8_t bufint[ BUFFMAX ]={0};

    uint8_t buf=0;

    uint8_t *sbuf= bufint ;


  • 你的指针没有指定地址空间,也就是单片机不知道把数据存到哪里,应该定义一个数组来接收。

  • 因为你这个sbuf指向的地址是0的原因,这个属于野指针操作,需要指向一个数组的地址才可以,添加一个uint8_t bf[];然后把下面是uint8_t *sbuf=bf;这样就可以了

  • 定义的*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;

    或者你就直接用数组接收,

  • 因为你的sbuf的地址是0,并没有分配空间,所以++后,就指在了不确定的地址,就会卡死,可以先给sbuf分配一个空间来存储数据

  • 你这里将指针指向的位置放到0x0那里,那个地方不是RAM的区域,相当于将值放到一块不合法的内存区域,这种肯定会出现内存错误的

    这里正确的做法是将uint8_t *sbuf=0;改为uint8_t sbuf[x]={0};

    这样编译器会给sbuf分配一个合法的内存地址,然后这个区域的长度x可以根据你的需要进行修改

相关问题

问题达人换一批

如何用指针来接收串口数据?