很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了。其实这是对C语言指针的不能熟练应用有关。指针是C语言的灵魂,也是最难的部分,可以直接进行内存操作,对数据的地址进行操作,更加接近底层,是单片机开发不可缺少的操作。我以轮询的方式对收发数据处理进行简要的说明,中断的方式以后再进行说明。 我们先看发送函数:

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


UART_HandleTypeDef *huart  huart 这个参数是UART_HandleTypeDef 结构体指针类型,我们俗称其为串口句柄。串口很多数据设置保存在这个结构体中。HAL库对其进行了集成,对寄存器进行了提前设置,通常我们输入需要进行通信的串口号,这就大大方便了我们的工作。   uint8_t *pData 指针指向首字符地址的字符串(字符以8位存储),这个参数其实就是要发送的数据。   uint16_t Size 指针指向首字符地址,往后所取的地址数。就是指针指向首地址后,作为起始部分,共发送多

少个字节。


  uint32_t Timeout  说白了就是发送等待时间。假如是1S,则1S内如果一直没有发送,1S后就跳出这个发送函数,执行其他的指令。等待1S时间发送,如果等了1S还不发送,就不等了。

基于NIOS的C语言 通过串口接收数据_stm32串口

以串口句柄huart1为例 ,发送”hellow word!”


可以以数组的形式定义:uint8_t str1[]="hellow word!"; 则发送函数为:HAL_UART_Transmit(&huart1,str1,sizeof(Tx_str1),500); 也可以指向首字符字符串定义:  uint8_t *str2="hellow word!";//占12个字节 则发送函数为:HAL_UART_Transmit(&huart1,str1,12,500);   再看接收函数:


HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


参数的意义与接收函数相同,但是接收的数据是指向字符串的首字符的指针,我们以收到4个字节数据,发送相同的4个字节数据为例:

        定义:

uint8_t  Buffer;
    if(HAL_UART_Receive(&huart1,&Buffer, 4, 0xffff) == HAL_OK)
     {
          HAL_UART_Transmit(&huart1,&Buffer,4,1000);
    }


为了方便字符串的处理,常常需要将收到的数据放入数组中进行数据处理。&Buffer是字符串的首地址,占空间是8位。指针所指的就是首地址,以收地址作为起始位置,占4个字节的数据。

基于NIOS的C语言 通过串口接收数据_stm32串口_02

uint8_t Buffer;
uint8_t str[]="0";// 初始化设置为0
uint8_t *Pstr[4];
    if(HAL_UART_Receive(&huart1,&Buffer, 4, 0xffff) == HAL_OK)
     {
    for(int i=0;i<4;i++)
    {
    Pstr[i]=&(Buffer)+i;
    str[i]=*Pstr[i];
    }
      HAL_UART_Transmit(&huart1,str,4,1000);
//发送完毕后,将指针指向的数据设置为0,可以这样写
    for(int i=0;i<4;i++)
    {
    *(&(Buffer)+i)=0;
    }


注意:定义指针变量的指针变量*和使用指针变量的*意义完全不同, 例如: int

*p=&a;// p是一个指针变量 *p=100;// p指针指向的数据地址(p是数据的地址,*p是指向的数据)。

或者   注:本身赋值时不能加*

int *p;
P=&a;
*p=100;