当前位置: 首页 > news >正文

stm32 串口发送和接收

串口发送

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>//初始化串口
void Serial_Init()
{//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9   ;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=9600;//波特率USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制USART_InitStruct.USART_Mode=USART_Mode_Tx;//Tx发送模式 Rx 接受模式USART_InitStruct.USART_Parity=USART_Parity_No;//校验位USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位USART_Init(USART1,&USART_InitStruct);USART_Cmd(USART1,ENABLE);
}
//发送一个字节
void Serial_SendByte(uint8_t Byte){USART_SendData(USART1,Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}
//发送一个数组
void Serial_SendArray(uint8_t *Array, uint16_t Length){uint16_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Array[i]);}
}//发送一个字符串
void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++){Serial_SendByte(String[i]);}
}
//数字计算
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y --){Result *= X;}return Result;
}
//发送数字
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');}
}
//封装printf
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}
//可变参数
void Serial_Printf(char *format, ...)
{char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String);
}

收发

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>uint8_t Serial_RxData;uint8_t Serial_RxFlag;
//初始化串口
void Serial_Init()
{//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9  ;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_10 ;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=9600;//波特率USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//Tx发送模式 Rx 接受模式USART_InitStruct.USART_Parity=USART_Parity_No;//校验位USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位USART_Init(USART1,&USART_InitStruct);USART_ITConfig(USART1,USART_IT_TXE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);USART_Cmd(USART1,ENABLE);
}
//发送一个字节
void Serial_SendByte(uint8_t Byte){USART_SendData(USART1,Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}
//发送一个数组
void Serial_SendArray(uint8_t *Array, uint16_t Length){uint16_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Array[i]);}
}//发送一个字符串
void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++){Serial_SendByte(String[i]);}
}
//数字计算
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y --){Result *= X;}return Result;
}
//发送数字
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');}
}
//封装printf
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}
//可变参数
void Serial_Printf(char *format, ...)
{char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String);
}uint8_t Serial_GetRxFlag(void)
{if (Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;
}uint8_t Serial_GetRxData(void)
{return Serial_RxData;
}void USART1_IRQHandler(void)  
{if (USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){Serial_RxData = USART_ReceiveData(USART1);Serial_RxFlag =1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"uint8_t RxData;int main(void)
{OLED_Init();OLED_ShowString(1,1,"RxData");Serial_Init();while (1){if(Serial_GetRxFlag()==1){RxData = Serial_GetRxData();Serial_SendByte(RxData);OLED_ShowHexNum(1,8,RxData,2);}}
}
http://www.lryc.cn/news/170605.html

相关文章:

  • Vite + Vue3 实现前端项目工程化
  • Java动态代理Aop的好处
  • 各种存储性能瓶颈如何分析与优化?
  • Android StateFlow初探
  • Docker Compose初使用
  • 测试与FastAPI应用数据之间的差异
  • WebStorm 2023年下载、安装教程、亲测有效
  • k8s储存卷
  • 【解决Win】“ 无法打开某exe提示无法成功完成操作,因为文件包含病毒或潜在的垃圾软件“
  • SpringBoot调用ChatGPT-API实现智能对话
  • element-table出现错位解决方法
  • DC电源模块具有不同的安装方式和安全规范
  • zabbix自定义监控、钉钉、邮箱报警
  • 短信、邮箱验证码本地可以,部署到服务器接口却不能使用
  • Java web基础知识
  • 【Linux学习】01Linux初识与安装
  • android 将数据库中的 BLOB 对象动态加载为 XML,并设置到 Android Activity 的内容视图上
  • Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)
  • springboot自定义Json序列化返回,实现自动转换字典值
  • Lostash同步Mysql数据到ElasticSearch(二)logstash脚本配置和常见坑点
  • 兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场
  • 76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)
  • 【ROS】RViz、Gazebo和Navigation的关系
  • 智能井盖:提升城市井盖安全管理效率
  • JavaWeb开发-06-SpringBootWeb-MySQL
  • 十六、垃圾回收相关概念
  • hive、spark、presto 中的增强聚合-grouping sets、rollup、cube
  • elasticsearch bulk 批量操作
  • 力扣11、 盛最多水的容器
  • IIC协议详解