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


相关文章
|
4月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
683 0
|
4月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
54 9
|
4月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
137 2
|
4月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
257 0
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
156 0
|
5月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解独立看门狗的本质和使用步骤&代码
【STM32】详解独立看门狗的本质和使用步骤&代码
|
5月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
422 2
|
5月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
502 4