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

串口发送数据

串口发送数据通常指单片机通过串口(USART/UART)向电脑发送数据


串口接收数据通常指单片机通过串口接收来自电脑的数据

目录

1.回顾串口数据发送的过程

2.TxE标志位

3.TC标志位

4.编程接口

4.1串口总开关

4.2查询标志位的值

4.3发送数据

5.编写代码

整理后的代码


1.回顾串口数据发送的过程

2.TxE标志位

        TxE是发送数据寄存器空标志位,用来判断发送数据寄存器里面有没有数据,如果发送数据寄存器(TDR)是空时,TxE=1,否则TxE-0

        通过查TxE标志位,可以避免发送数据丢失,比如发送数据寄存器里面有数据,你又发送了数据,这种情况下就会丢失数据

3.TC标志位

TC是发送完成标志位,用来指示USART里面的数据有没有发送完成。

当发送数据寄存器(TDR)是空且移位寄存器空时,TC=1,否则TC=0。

4.编程接口

4.1串口总开关

4.2查询标志位的值

4.3发送数据

用串口发送数据的时候一般用字节的方式发送,但uint16_t无符号的整形2个字节,因为当我们数据位9位的时候1个字节不够

5.编写代码

编写一个函数,实现使用串口一次性发送多个字节

USART_TypeDef 用来填写串口的名称

uint8_t 无符号八位指针类型

uint16_t 用来填写发送字节的数量

给电脑发送数据要准备USB TO TTL(USB转TTL模块)

可以把单片机的串口转换成USB接口,这样就可以实现单片机和电脑通信

注意TX和RX交替连接

下面图片用的是重映射的串口,所以选择PB6 PB7,当然你也可以不用映射的,那就选用PA9 PA10

串口调试工具

#include "stm32f10x.h"                  // Device headervoid My_USART_SendBytes(USART_TypeDef *USARTx ,uint8_t *pDate,uint16_t Size);int main(void)
{//1.串口初始化//开启USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//定义结构体USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //双向USART_InitStruct.USART_WordLength=USART_WordLength_8b;  //8数据位USART_InitStruct.USART_Parity=USART_Parity_No;  //无校验位USART_InitStruct.USART_StopBits=USART_StopBits_1;  //1位停止位USART_Init(USART1,&USART_InitStruct);//2.初始化IO引脚//初始化USART1引脚 TX发送 PA9 复用推挽输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//复用推挽输出GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//最大速度GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化USART1引脚 RX接收 PA10 输入上拉RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式不用设置速度GPIO_Init(GPIOA,&GPIO_InitStruct);//3.USART模块的总开关USART_Cmd(USART1,ENABLE);uint8_t byteToSend[]={1,2,3,4,5};My_USART_SendBytes(USART1,byteToSend,5);while (1){}
}void My_USART_SendBytes(USART_TypeDef *USARTx ,uint8_t *pDate,uint16_t Size)
{for(uint32_t i=0;i<Size;i++){//1.等待发送数据寄存器为空 TXE=1是为空,等于0时不为空,而RESET=0,所以只要不为空,就会一直在while循环里面while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//2.将要发送的数据写入到发送数据寄存器USART_SendData(USARTx,pDate[i]);}//3.等待数据发送完成 TC为1时才表示发送完成,所以只要TC==0就一直循环while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}

整理后的代码

#include "stm32f10x.h"                  // Device headervoid My_USART_SendBytes(USART_TypeDef *USARTx ,uint8_t *pDate,uint16_t Size);void My_USART1_Init(void);int main(void)
{My_USART1_Init();uint8_t byteToSend[]={1,2,3,4,5};My_USART_SendBytes(USART1,byteToSend,5);while (1){}
}
//
// @简介:通过串口发送多个数据并检测是否发送完成
// @参数 USARTx:填写串口的名称
// @参数 pDate:要发送的数据
// @参数 Size:要发送数据的数量,单位是字节
//
void My_USART_SendBytes(USART_TypeDef *USARTx ,uint8_t *pDate,uint16_t Size)
{for(uint32_t i=0;i<Size;i++){//1.等待发送数据寄存器为空 TXE=1是为空,等于0时不为空,而RESET=0,所以只要不为空,就会一直在while循环里面while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//2.将要发送的数据写入到发送数据寄存器USART_SendData(USARTx,pDate[i]);}//3.等待数据发送完成 TC为1时才表示发送完成,所以只要TC==0就一直循环while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
//
// @简介:对USART1进行初始化
// 		PA9 - Tx PA10 - Rx
//		15200 8位数据位 1位停止位 None校验位 双向
//
void My_USART1_Init(void)
{//1.串口初始化//开启USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//定义结构体USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //双向USART_InitStruct.USART_WordLength=USART_WordLength_8b;  //8数据位USART_InitStruct.USART_Parity=USART_Parity_No;  //无校验位USART_InitStruct.USART_StopBits=USART_StopBits_1;  //1位停止位USART_Init(USART1,&USART_InitStruct);//2.初始化IO引脚//初始化USART1引脚 TX发送 PA9 复用推挽输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//复用推挽输出GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//最大速度GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化USART1引脚 RX接收 PA10 输入上拉RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式不用设置速度GPIO_Init(GPIOA,&GPIO_InitStruct);//3.USART模块的总开关USART_Cmd(USART1,ENABLE);
}


文章转载自:

http://rpM5ROyZ.tdwjj.cn
http://FTeoCayM.tdwjj.cn
http://lzxAoJAu.tdwjj.cn
http://VovOkr3Q.tdwjj.cn
http://hfV3YZ95.tdwjj.cn
http://3m4ICGx4.tdwjj.cn
http://E65aEVg5.tdwjj.cn
http://sqPDnfSa.tdwjj.cn
http://p2QMa0Ui.tdwjj.cn
http://Zo6XmAdj.tdwjj.cn
http://7eLzS5E1.tdwjj.cn
http://PkclYeyp.tdwjj.cn
http://TIPrvWEd.tdwjj.cn
http://O7XxLE6c.tdwjj.cn
http://hfV30i92.tdwjj.cn
http://JArLUVQO.tdwjj.cn
http://UYYhdorq.tdwjj.cn
http://20aVaiSL.tdwjj.cn
http://1h9DdFGf.tdwjj.cn
http://vNWFDvCw.tdwjj.cn
http://hRWgn7Ux.tdwjj.cn
http://6HRTW17G.tdwjj.cn
http://1ASwqn6y.tdwjj.cn
http://FGa0V00q.tdwjj.cn
http://WVgUKVfT.tdwjj.cn
http://uULqTsUB.tdwjj.cn
http://iTvWHHct.tdwjj.cn
http://2Kpp2Tso.tdwjj.cn
http://ojOMEAtm.tdwjj.cn
http://b9ib0J7O.tdwjj.cn
http://www.dtcms.com/a/371180.html

相关文章:

  • qiankun 微前端接入实战
  • AI笔记 - 网络训练 -人脸识别opensphere
  • css 十大常用英文字体
  • Python Day 46
  • 蓓韵安禧DHA温和配方:健康营养守护新篇章
  • disable CASCADE主键失败 ORA-2297 And ORA-2433
  • VSCode下载安装与汉化
  • JWT概念及使用详解
  • LwIP入门实战 — 3 以太网外设 (ETH)
  • PowerBI TopN Others
  • 【完整源码+数据集+部署教程】室内场景分割系统源码和数据集:改进yolo11-DWR
  • 零基础Linux操作基础小白快速掌握Shell脚本--流程控制和循环(二)
  • 笔记本连接显示屏显示不全如何解决
  • 【C++】vector 深度剖析及模拟实现
  • Leetcode hot100 最长连续序列
  • Python错误测试与调试——文档测试
  • AI浪潮下,人类创造力的“危”与“机”
  • ​MyBatis关键源码解析​
  • 使用Spring Boot DevTools快速重启功能
  • 【视网膜分割】AFMIP-Net:一种新型的自适应特征调制和隐式提示网络
  • 使用 n8n 结合通义千问大模型构建业务数据库分析智能体
  • 【完整源码+数据集+部署教程】水培植物病害检测系统源码和数据集:改进yolo11-AKConv
  • 解决 Gitee 中 git push 因邮箱隐私设置导致的失败问题
  • 网络中的PAT:小端口映射的大能量
  • 鸿蒙NEXT主题设置指南:应用级与页面级主题定制详解
  • 贪心算法应用:DNA自组装问题详解
  • GEE:基于自定义的年度时序数据集进行LandTrendr变化检测
  • 电子元器件+模拟电路硬件
  • 源码部署mysql8.0.40
  • STM32----W25QXX