stm32串口收发程序_stm32 串口通信收发说明

很多网友在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还不发送,就不等了。

9babc2cad1b3a6f88dc40aa8ee6c43ad.png

以串口句柄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个字节的数据。

3942eb79462a4c320652ba69666eb5a2.png

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;

则可以输出:a=100
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值