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

STM32:串口发送+串口接收(内含:查询法+中断法+思路图+代码部分)

有两种方法:

1.查询法(适合程序简单的串口发送+接收)

思路图如下:

代码部分:

主函数代码部分:

 

Serial.c代码部分:

 

2.中断法:

向NVIC申请中断,在中断函数接收数据。

思路图如下:

 

 

 

 

Serial.h代码部分:

 

主函数部分:

 

代码部分如下:

主函数部分:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"


uint8_t RxData;

int main(void)
{
    OLED_Init();
    Serial_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);
        }
    }
}
 

Serial.c代码部分:

#include "stm32f10x.h"                  // Device header

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

void Serial_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB1PeriphClockCmd(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;
    USART_InitStruct.USART_Parity=USART_Parity_No;
    USART_InitStruct.USART_StopBits=1;
    USART_InitStruct.USART_WordLength=USART_WordLength_8b;
    USART_Init(USART1,&USART_InitStruct);
    
    USART_ITConfig(USART1,USART_IT_RXNE,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);
    
}

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_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        Serial_RxData = USART_ReceiveData(USART1);
        Serial_RxFlag = 1;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}


void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1,Byte);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}

void Serial_SendArray(uint16_t *Array,uint8_t Lenth)
{
    uint8_t i;
    for(i=0;i<Lenth;i++)
    {
        USART_SendData(USART1,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(uint16_t x,uint16_t y)
{
    uint32_t Return;
    while(y--)
    {
        Return*=x;
    }
        return Return;
}

void Serial_SendNumber(uint32_t Number,uint8_t Lenth)
{
    uint8_t i;
    for(i=0;i<Number;i++)
    {
        USART_SendData(USART1,Number/Serial_Pow(10,Lenth-1-i)%10+0x40);
    }
}

Serial.h代码部分:

#ifndef  __SERIAL_H
#define  __SERIAL_H

void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint16_t *Array,uint8_t Lenth);
void Serial_SendString(uint16_t String);
uint32_t  Serial_Pow(uint16_t x,uint16_t y);
void Serial_SendNumber(uint32_t Number,uint8_t Lenth);

uint8_t Serial_GetRxFlag(void);
uint8_t Serial_GetRxData(void);

#endif
 

相关文章:

  • C语言——经典200道实例(16-20)
  • Python如何快速定位最慢的代码?
  • 【无人机】四旋翼飞行器控制、路径规划和轨迹优化(Matlab代码实现)
  • ESP8266-Arduino网络编程实例-Web服务器(从LittleFS加载页面文件)
  • 【图解CAN总线】-7-Classic CAN 2.0总线网络“负载率”计算(方法二)
  • 3.线性神经网络----动手学深度学习
  • 搭建zabbix4.4.6以及企业微信告警功能实现
  • 文件输入与输出io
  • SpringBoot整合Docker实现一次构建到处运行
  • 程序员眼中的Linux操作系统——初识指令
  • process.env.NODE_ENV与@vue/cli-service及其.env.*默认外部环境配置文件之跨域部署
  • MySQL:用户权限和语言接口
  • 2022年广西壮族自治区中职网络安全技能竞赛“Linux操作系统渗透测试详解”
  • 沉睡者 - 抖音中视频计划横版16:9视频制作教程
  • 强大的包管理器Poetry
  • [LeetCode] Wiggle Sort
  • 【Linux系统编程】快速查找errno错误码信息
  • 【译】理解JavaScript:new 关键字
  • C++类的相互关联
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 一些 DOM 的知识点
  • Java应用性能调优
  • Material Design
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • python3 使用 asyncio 代替线程
  • rc-form之最单纯情况
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 基于Android乐音识别(2)
  • 前端_面试
  • 前端自动化解决方案
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 消息队列系列二(IOT中消息队列的应用)
  • 一起参Ember.js讨论、问答社区。
  • 用Python写一份独特的元宵节祝福
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​Java并发新构件之Exchanger
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #if 1...#endif
  • #Z0458. 树的中心2
  • (python)数据结构---字典
  • (剑指Offer)面试题34:丑数
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十八)SpringBoot之发送QQ邮件
  • (转)3D模板阴影原理
  • (转)树状数组
  • (转载)hibernate缓存
  • .form文件_SSM框架文件上传篇
  • .net 按比例显示图片的缩略图
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net下的富文本编辑器FCKeditor的配置方法
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • []利用定点式具实现:文件读取,完成不同进制之间的