已解决
stm32 串口发送和接收
来自网友在路上 180880提问 提问时间:2023-09-23 14:56:35阅读次数: 80
最佳答案 问答题库808位专家为你答疑解惑
串口发送
#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);}}
}
查看全文
99%的人还看了
相似问题
- PC 与 嵌入式板 传输文件的方式汇总 / SSH、NFS、TFTP,USB,串口
- stm32HAL库串口错误回调函数的使用
- MFC串口通信(SerialPort)
- macos端串口调试推荐 serial直装激活 for mac
- Luatos Air700 改变BL0942串口波特率
- 【全志H616 使用标准库 完成自制串口库(分文件实现) orangepi zero2(开源)】.md updata: 23/11/07
- 【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
- 【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】
- QT串口接收数据并进行波形显示(含源码)
- Golang 串口通信
猜你感兴趣
版权申明
本文"stm32 串口发送和接收":http://eshow365.cn/6-12154-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: API(十)时间相关的SDK
- 下一篇: 苏宁滑块验证