STM32F103C8T6串口通信-将上位机发给MCU的数据发回给上位机

#ifndef __USART_H__
#define __USART_H__#include "stm32f10x.h"
#include <stdio.h>//重定向的函数要用#define USART1_SEND_BYTE_NUM  512//定义发送字节数extern uint16_t USART1_RX_STATE;
extern uint16_t USART1_SEND_BYTE[];void USART1_GPIO_Init(void);
int fputc(int ch, FILE *f);#endif

usart.h

#include "usart.h"uint16_t USART1_RX_STATE = 0;//定义标志位
uint16_t USART1_SEND_BYTE[USART1_SEND_BYTE_NUM];void USART1_GPIO_Init(void)
{//1.指定并配置GPIO端口//2.配置串口1//3.使能端口时钟,具体的复用功能时钟//4.使能串口1
    GPIO_InitTypeDef   GPIO_InitStruct;USART_InitTypeDef  USART_InitStruct;//PA9 复用功能USART1 TX---需要配置为复用推挽输出--具体模式说在参考手册GPIO章节能查询到,我并未查到GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//使能时钟-端口时钟,复用功能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);GPIO_Init(GPIOA, &GPIO_InitStruct);//PA10 复用功能USART1 RX---需要配置为浮空输入  --具体模式说在参考手册GPIO章节能查询到,我并未查到
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_Init(GPIOA, &GPIO_InitStruct);//配置USART1USART_InitStruct.USART_BaudRate = 9600;//常用波特率值USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_Init(USART1, &USART_InitStruct);//使能串口1
    USART_Cmd(USART1, ENABLE);//串口中断设置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//配置接收非空产生中断
}//实现串口打印功能需要调用printf函数,需要重定向fputc函数int fputc(int ch, FILE *f)
{while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);USART_SendData(USART1, (unsigned char)ch);//该函数本来是把要打印的字符串ch输出到数据流中;被串口从中拿到数据ch的拷贝,并发通过USART_SendData发送到数据输出寄存器USART_DR
//    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);//数据发送到USART_DR时,USART_FLAG_TC会标志位置高;USART_GetITStatus函数一般是用在中断里确认是哪种中断
//因为这句放下面会经常出现缺少一个字符,所以移动到上面了,不知道啥原因return ch;    //数据继续发送到数据流中
}//void USART1_Send(uint16_t msg)
//{
//    
//}

usart.c

 

#ifndef __NVIC_H__
#define __NVIC_H__#include "stm32f10x.h"void NVIC_GPIO_Init(void);#endif

nvic.h

 

#include"nvic.h"void NVIC_GPIO_Init(void)
{NVIC_InitTypeDef   NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority  = 2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_Init(&NVIC_InitStruct);
}

nvic.c

 

 

#include "stm32f10x_it.h"
#include "usart.h"extern uint16_t USART1_RX_STATE;
extern uint16_t USART1_SEND_BYTE[];void USART1_IRQHandler(void)
{uint8_t res = 0;//进入该中断,说明数据接收寄存器RDR接收到数据if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//    接收数据寄存器RDR接收到数据时
    {res = USART_ReceiveData(USART1);if((USART1_RX_STATE & 0x8000) == 0)    //如果最高位为0,说明没有接收完成
        {if(USART1_RX_STATE&0x4000)//次高位为1情况下
            {if(res == 0x0a)    //次高位为1情况下,如果收到0x0a,需要最高位标志位置1
                {USART1_RX_STATE |= 0x8000;}else //次高位已经收到0X0D,最后一个字节却不是0X0A,数据都不要了
                {USART1_RX_STATE = 0;//次高位已经收到0X0D,最后一个字节却不是0X0A,数据都不要了
                }}else//次高位并没有置1,没有收到0x0d
            {if(res == 0x0d)              //如果这一个数据正好是0x0d,则次高位置1
                {USART1_RX_STATE |= 0x4000;}else  //这个数据并不是0X0D,则是USART1_RX_STATE&0x3fff之前的接收序号数据
                {USART1_SEND_BYTE[USART1_RX_STATE&0x3fff] = res;USART1_RX_STATE ++;if(USART1_RX_STATE > USART1_SEND_BYTE_NUM-1){USART1_RX_STATE = 0;}}}}
//        else 
//        {
//            
//            
//        }
    }
}
stm32f10x_it.c

#include "stm32f10x.h"
#include "usart.h"
#include "nvic.h"
//mcu transmit data to PC repeatedly ,while PC transmit data to MCU,then MCU will transmit the data what the PC transmit;
//MCU重复不断给PC发数据,当PC给MCU发数据时,MCU会把收到的信息发回给PCint main(void)
{uint8_t t,len;NVIC_GPIO_Init();USART1_GPIO_Init();printf("hello,world!\r\n");while(1){if(USART1_RX_STATE&0x8000){len =  USART1_RX_STATE&0x3fff;for(t = 0; t < len; t++){USART_SendData(USART1, USART1_SEND_BYTE[t]);while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);}USART1_RX_STATE = 0;}}
}

main.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891659.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习——数组

数组的定义和声明1.声明数组 int[] array =null;这一步在栈里面压入了一个array;声明的时候数组还不存在 2.创建数组 array=new int[10] ;这一步在堆里面开辟了一个内存 3.给数组元素赋值 for (int i = 0; i < nums.length; i++) { nums[i] = i + 1; System.out.println(nu…

pyenv下载慢的解决方式

pyenv install 不知道为什么会卡住 解决方法就是手动直接下载对应的版本 放到对应的目录 例如这里显示的To C:\Users\28453\.pyenv\pyenv-win\install_cache\python-3.12.9-amd64.exe 我们只需要到 python 官网去下载对应的版本 并放到指定目录 我用的是 pyenv-win 需要下载 …

MongoDB聚合查询

MongoDB聚合查询 创建测试数据 db.student.drop() db.student.insertOne({_id: 1,name: "zhangsan",age: 12,teacher: ["Tom","Jack"]}) db.student.insertOne({_id: 2,name: "lisi",age: 15,teacher: ["Lucy","Tom&qu…

htmx怎么样,光速弃坑

前言 htmx可以说是对html标签的加强,提供了一些额外的标签属性,来获得一些功能,比如ajax局部渲染之类的。 快速自定义事件等等…… 使用? <script src="https://cdn.bootcdn.net/ajax/libs/htmx/2.0.4/htmx.min.js"></script>我想首先使用一下获取&l…

2024春季NOI省选游记

前言 初二,同步赛选手,Day 1 还行,Day 2 拉跨。 Day 1 (时刻有些许偏差) \(8:25\) 公布密码了,居然没有 PDF 密码。 \(8:26\) 开 T1,感觉余数必须要枚举,剩下的可能需要 \(\log\) 找解。 \(8:35\) 开始写二分,没过大样例。 \(8:57\) 调了半天,发现二分是假的。 \(9:13\…

3.1 多元函数的全微分

1 多元函数的全微分 1.1 定义 1.1.1 回顾一元函数的微分 1.1.2 多元函数的定义1.1.3 可微推导连续 但连续不一定可微,证明如下: 若连续一定可微,又一元函数必满足二元函数的性质,又一元函数可微必可导,可推至连续必可导,矛盾 1.2 多元函数可微的必要条件 1.2.1 可微必可导…

React—10—受控组件和非受控组件;高阶组件

一、概念 我的理解是,是否有react提供数据,分为受控组件和非受控组件。 比如input元素,只要绑定了value属性,那么在react中,用户在输入框输入的值不会显示在输入框(react应该做了限制,原生html的input框即使value绑定了值依然可以输入), 这就导致,想改变value的值,必须…

autojs通过vscode写好的文件上传的手机,并打包apk

1.安装vscode 2.下载autojs插件和chinese插件3.启动autojs插件,手机才可以链接 (链接时输入的是手机的ip地址)4.上传到手机5.打包本文来自博客园,作者:六月OvO,转载请注明原文链接:https://www.cnblogs.com/chenlifan/p/18745272

Windows 提权-UAC 绕过

本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 场景一:枚举得到存储的管理员凭证(GUI 环境)1.1 使用 netplwiz.exe 帮助主题绕过 UAC2 场景二:枚举得到…

三剑客与正则系列-正则表达式

1.注意事项正则符号都是英文符号,避免使用中文符号 推荐使用grep/egrep命令,默认设置了别名,自动加上颜色 http://nbre.oldboylinux.cn/ 分析正则与正则匹配到的内容. 其他坑.# "" . #‘’ ”“ 。alias grep=grep color=auto alias egrep=egrep color=auto2.符号概述…

【凸优化笔记2】-凸函数、下水平集、范数

转自:https://zhuanlan.zhihu.com/p/102098039 1. 凸函数 1.1 凸函数定义 一个函数𝑓:𝑅𝑛→𝑅是凸的,如果定义域𝑑𝑜𝑚𝑓是凸集,并且对于所有𝑥,𝑦∈𝑑𝑜𝑚𝑓,𝜃∈[0,1],都有: 𝑓(𝜃𝑥+(1−𝜃)𝑦)≤𝜃𝑓(𝑥)+(1−𝜃)𝑓…

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难? 我总结了四篇近期的研究论文,来展示AI是如何以及为什么侵蚀我们的批判性思维能力。作者使用AI制作的图像前言:作者在这篇文章中,借AI技术的崛起,揭示了一场悄然发生的思想博弈。表面上,AI为我们带来了前所未有的效率与便捷,但在无形之中,…