2019-11-25

串口收发

基本思路,初始上电,发送一次指令格式,串口输入控制led。如果输入错误则提示输入格式。

Cubemx新建工程 设置串口 生成代码


2019-11-25_第1张图片
设置串口
2019-11-25_第2张图片
开启中断

1、串口发送/接收函数

                HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制

                HAL_UART_Receive();串口轮询模式接收,使用超时管理机制

                HAL_UART_Transmit_IT();串口中断模式发送

                HAL_UART_Receive_IT();串口中断模式接收

                HAL_UART_Transmit_DMA();串口DMA模式发送

                HAL_UART_Transmit_DMA();串口DMA模式接收

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

功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

参数:

UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1

*pData      需要发送的数据 

Size    发送的字节数

Timeout   最大发送时间,发送数据超过该时间退出发送   

举例:  HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff);  //串口发送三个字节数据,最大传输时间0xffff

————————————————

版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

功能:串口中断接收,以中断方式接收指定长度数据。

大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。

再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

参数:

UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  

*pData      接收到的数据存放地址

Size    接收的字节数

举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);  //中断接收一个字符,存储到value中

————————————————

版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783

   2、串口中断函数

             HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用

                HAL_UART_TxCpltCallback();数据完全发送完成后调用

                HAL_UART_RxHalfCpltCallback();一般数据接收完成时调用

                HAL_UART_RxCpltCallback();数据完全接受完成后调用

                HAL_UART_ErrorCallback();传输出现错误时调用

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  

功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,

           串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,

参数:

UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  

举例:  HAL_UART_RxCpltCallback(&huart1){          //用户设定的代码              }

————————————————

版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783

usart.c 添加库  #include

并增加如下代码,重定向c函数库用的,没看明白。

int fputc(int ch, FILE *f)

{

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);

  return ch;

}

int fgetc(FILE * f)

{

  uint8_t ch = 0;

  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);

  return ch;

}

Main  函数添加库  #include "stdio.h"

int main(void)前添加如下代码 

uint8_t aTxStartMessages[] = "\r\n******UART commucition using IT******\r\nPlease enter 1 or 0 :\r\n";//1打开led 0关闭led

uint8_t ch;//定义ch

char len[] = "12354687496865";//定义len

while (1)前添加如下代码

HAL_UART_Transmit_IT(&huart1 ,(uint8_t*)aTxStartMessages,sizeof(aTxStartMessages));第一次上电打印指令

while (1)中添加如下代码

ch=getchar(); //获取字符串,只能接受1个字母或数字,没明白用法

 //scanf("%c",&ch);//获取字符串,只能接受2个字母或数字,没明白用法

    printf("接收到字符串:%c\n",ch);//打印字符串,%c表示打印字符串。%d表示打印数字

    if(ch=='0') //如果收到0

    {

        HAL_GPIO_WritePin (GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//关闭8脚上的led

printf("off");//打印off,如果打印的不是变量,可不加%c

    }

    if(ch=='1')//如果收到1

    {

      HAL_GPIO_WritePin (GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//打开8脚上的led

printf("on");//打印off,如果打印的不是变量,可不加%c

}

if(ch!='0'&&ch!='1')//如果不是零,也不是1,打印len数组的长度。

{

printf("%d",sizeof(len));

}

测试如下


2019-11-25_第3张图片

你可能感兴趣的:(2019-11-25)