当前位置:   article > 正文

stm32串口发送字符、字符串(标准库)_stm串口通信如何如何传输字符串

stm串口通信如何如何传输字符串

目录

一 芯片概述 

二 代码编写

2.1 以串口2为例配置初始化代码

2.2 发送自定义长度的字符串

2.3 发送单个字符

2.4 自定义printf函数

三 完整代码

3.1 usart2.c

3.2 usart2.h

3.3 while(1)


一 芯片概述 

本文以stm32f103c8t6系列芯片为例,使用自定义函数发送串口数据。

二 代码编写

2.1 以串口2为例配置初始化代码

PA2为TX引脚,PA3为RX引脚

  1. void usart2_init(u32 bound)
  2. {
  3. //GPIO端口设置
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. USART_InitTypeDef USART_InitStructure;
  6. NVIC_InitTypeDef NVIC_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART2,GPIOA时钟
  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  9. //USART2_TX GPIOA.2
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  13. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
  14. //USART2_RX GPIOA.3初始化
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  17. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
  18. //Usart2 NVIC 配置
  19. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  22. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  23. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  24. //USART 初始化设置
  25. USART_InitStructure.USART_BaudRate = bound;//串口波特率
  26. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  27. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  28. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  29. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  30. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  31. USART_Init(USART2, &USART_InitStructure); //初始化串口2
  32. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  33. USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
  34. USART_Cmd(USART2, ENABLE); //使能串口2
  35. }

2.2 发送自定义长度的字符串

第一个变量是发送的数据,第二个变量为发送的数据的长度

  1. void usart2_send(unsigned char *data,unsigned char len)
  2. {
  3. unsigned char t;
  4. for(t=0;t<len;t++)
  5. {
  6. while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
  7. USART_SendData(USART2,data[t]);
  8. }
  9. }

例:

usart2_send((uint8_t*)"xiaoliCL\r\n",12);

使用效果:

一直发送字符串“xiaoliCL\r\n”

2.3 发送单个字符

  1. void usart2_SendByte(char dat)
  2. {
  3. USART_SendData(USART2, (unsigned char) dat);
  4. while (!(USART2->SR & USART_FLAG_TXE));
  5. }

例:

usart2_SendByte('a');

使用效果:

一直发送字符 'a'

2.4 自定义printf函数

  1. #define USART2_MAX_RECV_LEN 600 //最大接收缓存字节数
  2. u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
  3. void u2_printf(char* fmt,...)
  4. {
  5. u16 i,j;
  6. va_list ap;
  7. va_start(ap,fmt);
  8. vsprintf((char*)USART2_TX_BUF,fmt,ap);
  9. va_end(ap);
  10. i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
  11. for(j=0;j<i;j++)//循环发送数据
  12. {
  13. while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待上次传输完成
  14. USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]); //发送数据到串口2
  15. }
  16. }

使用方法和printf一样,例:

u2_printf("xiaoliCL2\r\n");

使用效果:

三 完整代码

3.1 usart2.c

  1. #include "sys.h"
  2. #include "usart2.h"
  3. #include "delay.h"
  4. #include "stdarg.h"
  5. #include "stdio.h"
  6. #include "string.h"
  7. #include "user_peripheral.h"
  8. #if USART2_Pre
  9. u8 Uart2Buff;
  10. u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节
  11. void usart2_init(u32 bound)
  12. {
  13. //GPIO端口设置
  14. GPIO_InitTypeDef GPIO_InitStructure;
  15. USART_InitTypeDef USART_InitStructure;
  16. NVIC_InitTypeDef NVIC_InitStructure;
  17. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART2,GPIOA时钟
  18. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  19. //USART2_TX GPIOA.2
  20. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  21. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  23. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
  24. //USART2_RX GPIOA.3初始化
  25. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  27. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
  28. //Usart2 NVIC 配置
  29. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  30. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  31. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  32. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  33. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  34. //USART 初始化设置
  35. USART_InitStructure.USART_BaudRate = bound;//串口波特率
  36. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  37. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  38. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  39. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  40. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  41. USART_Init(USART2, &USART_InitStructure); //初始化串口2
  42. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  43. USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
  44. USART_Cmd(USART2, ENABLE); //使能串口2
  45. }
  46. void usart2_send(unsigned char *data,unsigned char len)
  47. {
  48. unsigned char t;
  49. for(t=0;t<len;t++)
  50. {
  51. while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
  52. USART_SendData(USART2,data[t]);
  53. }
  54. }
  55. void usart2_SendByte(char dat)
  56. {
  57. USART_SendData(USART2, (unsigned char) dat);
  58. while (!(USART2->SR & USART_FLAG_TXE));
  59. }
  60. void USART2_IRQHandler(void) //串口2中断服务程序
  61. {
  62. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  63. {
  64. Uart2Buff=USART_ReceiveData(USART2); //读取接收
  65. }
  66. }
  67. #define USART2_MAX_RECV_LEN 600 //最大接收缓存字节数
  68. u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
  69. void u2_printf(char* fmt,...)
  70. {
  71. u16 i,j;
  72. va_list ap;
  73. va_start(ap,fmt);
  74. vsprintf((char*)USART2_TX_BUF,fmt,ap);
  75. va_end(ap);
  76. i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
  77. for(j=0;j<i;j++)//循环发送数据
  78. {
  79. while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待上次传输完成
  80. USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]); //发送数据到串口2
  81. }
  82. }
  83. #endif

3.2 usart2.h

  1. #ifndef __USART2_H
  2. #define __USART2_H
  3. #include "sys.h"
  4. #define USART2_MAX_SEND_LEN 600 //最大发送缓存字节数
  5. void usart2_send(unsigned char *data,unsigned char len);
  6. void usart2_init(u32 bound); //串口2初始化
  7. void u2_printf(char* fmt,...);
  8. void usart2_SendByte(char dat);
  9. #endif

3.3 while(1)

串口发送:

  1. while(1)
  2. {
  3. // usart2_send((uint8_t*)"xiaoliCL\r\n",12);
  4. // u2_printf("xiaoliCL2\r\n");
  5. // usart2_SendByte('a');
  6. delay_ms(1000);
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/713628
推荐阅读
相关标签
  

闽ICP备14008679号