STM32:串口通信(串口发送)(内含:1.接线图+2.实物图+3.代码部分)

简介: STM32:串口通信(串口发送)(内含:1.接线图+2.实物图+3.代码部分)

1.接线图如下:


9a02a455740043bd99c70cffbbf8fdeb.png


跳线帽接在4~5引脚,2,3引脚连接PA9和PA10引脚。下图也可得出USART接PA9和PA10引脚。


TX和RX是交叉连接。PA9(黄线)是TX,接RXD。PA9(绿线)是RXD,接TX.


图中的串口模块和STINK都接电脑上,使之拥有独立供电。


44c7f0235c044a9cb65960342b704478.png


2.实物图:


3e981558f73c48e1824585c929e6fa3c.png


黄色为跳线帽,接4~5引脚。


dc44bc8b6d8e49a6a055716eff2dc442.png


电机我的电脑,设备管理器,查找端口的USB如图所示即为连接正确。


实验现象:发送41,接收时文件解析有两种,HEX模式如下:


39a0d4ebd1dd41d99560103c91c2a643.png


文本模式如下:


1a9b143852594c44a8be6b8e35e730e5.png


数据模式:


3dc0c53f34c646ec91d1426b53721441.png


3. 代码部分


主函数代码(main.c)部分:


0ba3ea73e7f64a32ba8e2ff154a09525.png

5dcbc4ee30ca4d0a9f27a75fc220af67.png

注:此处警告可忽视


#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
int main(void)
{
OLED_Init();
Serial_Init();
//发送字节
Serial_SendByte(0x41);//TX发送一个字节的数据0x41的波形,该波形可以传递给电脑等其他接收端。
//发送数组
Serial_SendByte('A');//也可以字符的形式发送,此时先对数据进行编码,然后变为0x41
//发送数组
uint8_t MyArray[]={0x42,0x43,0x44,0x45};
Serial_SendArray(MyArray,4);//一般使用在HEX模式
//发送字符串
Serial_SendString("HelloWord!");//一般使用在文本模式
//发送字符形式的数字
Serial_SendNumber(111, 3);
//使用printf打印
printf("Num=%d\r\n",666);
char String[100];//定义字符串
sprintf(String,"Num=%d\r\n", 333);//sprintf可定义打印字符串的位置
Serial_SendString(String);//发送字符串String
while(1)
{
}
}


串口发送函数(Serial.c)代码部分:


7deddc4c751f41d3b8f34d5cbc8408ab.png


8c3f4daa07114ab9b235d9c8d384b640.png

f239c8e45495455c893e0769dd1d4003.png

c06b2a88e973408ab7ecc3eb7dd2ba71.png


#include "stm32f10x.h" // Device header
#include <stdio.h>
//思路:参考USART基本结构图
//1.开启时钟,SUART和GPIO
//2.GPIO初始化,配置TX为复用输出,RX为输入。
//3.配置USART(结构体)
//4.发送功能:开启USART..接收功能:配置中断(配置USART之前+ITConfig和NVIC的代码)。
//5.发送数据,就调用发送数据函数;接收数据,就调用接收数据函数。获取发送和接收状态,调用获取标志位的函数。
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//TX是外设的输出脚,使用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=9600;//波特率(函数内部自己计算)
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
//USART_HardwareFlowControl是硬件流控制(None不使用流控;只使用CTS;只用RTS;CTS,RTS都使用)
USART_InitStruct.USART_Mode=USART_Mode_Tx;//TX只有发送模式,RX只有接收模式(两个都需要就...RX|....TX)
USART_InitStruct.USART_Parity=USART_Parity_No;//校验位(Odd奇校验,Even偶校验,No无校验)
USART_InitStruct.USART_StopBits=USART_StopBits_1;//n位停止位(可选择0.5 1 1.5 2)
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//字长(不校验字长即为8位)
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1,ENABLE);
}
//发送数据函数,调用该函数,可以从TX引脚发送一个字节数据
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1,Byte);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待TX置1
}
void Serial_SendArray(uint8_t *Array,uint16_t Length)//Array是数组,数组名是首元素地址,*Array是解引用
{
uint16_t i;
for(i=0;i<Length;i++)
{
Serial_SendByte(Array[i]);//依次取出数组Array的每一项并发送
}
}
void Serial_SendString(char *String)//字符串自带结束标志位
{
char i;
for(i=0;String[i]!=0;i++)
//此处0是字符0,是空字符,对应结束标志,如果不等于0就是继续循环,等于0就是结束,停止循环,等价于'\0'
{
Serial_SendByte(String[i]);
}
}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)//次方函数,返回值是X的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');
}
}
int fputc(int ch,FILE*f)
{
Serial_SendByte(ch);
//将prinft输出的东西从屏幕改为输出到串口,需要重定向。----解释:printf也是使用fputc一个一个进行打印的
return ch;
}


串口通信(Serial.h)代码部分:


6f0de9ed81824995b2297a76204e028a.png


#ifndef __SERIAL_H
#define __SERIAL_H
#include <stdio.h>
void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array,uint16_t Length);
void Serial_SendString(uint8_t *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(uint8_t*format,...);
#endif


相关文章
|
7月前
STM32串口编程基础知识讲解
STM32串口编程基础知识讲解
58 0
|
29天前
|
芯片
stm32f4外设学习篇(代码集合)(一)
stm32f4外设学习篇(代码集合)
|
2月前
|
存储 缓存 芯片
STM32--USART串口
STM32--USART串口
|
2月前
STM32控制SG90舵机原理及代码
STM32控制SG90舵机原理及代码
33 1
|
2月前
|
Java C语言
STM32使用printf重定向到USART(串口)并打印数据到串口助手
STM32使用printf重定向到USART(串口)并打印数据到串口助手
38 0
|
4月前
|
存储 传感器
【STM32基础 CubeMX】uart串口通信
【STM32基础 CubeMX】uart串口通信
128 0
|
7月前
|
存储 物联网 芯片
STM32速成笔记(十四)—串口IAP
本文介绍了什么是IAP,IAP有什么作用,如何实现IAP。最后,给出了IAP的实现程序。
115 0
STM32速成笔记(十四)—串口IAP
|
7月前
|
芯片
STM32速成笔记(五)—串口通信
本文介绍了串口通信的概念,用途以及一些相关概念。介绍了如何进行printf重定向,如何根据接收到的特定信息,执行特定操作。此外,本文以通过上位机发送特殊指令控制LED亮灭的小项目,给出了详细的配置方法和程序设计。
123 0
STM32速成笔记(五)—串口通信
|
8月前
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断