通信方式
通讯方式
a)单工 :只能固定方为发送 一方为接收 并且是固定方向
b)半双工 :两边都可 做发送或者接收 但是只能是某个时间段
C):全双工 :两个都可做发送或者接收 任何时间段都可进行通信
数据同步方式 @数据同步方式 类似
RX :接收端 TX :发送端
特点:
1 数据传送是以数据块传送的(多个字符组成的数据块流)
2 因为每一次传输的数据块中包含的数据较多,所以在接收时钟和发送时钟要严格同步 通常要用同步时钟
3 发送和接收是时刻相同
数据异步方式
没有时钟的约束 就让通讯双方的发送和接收不同步,
导致了接收一方根本不知道发送一方什么时候发送数据了,
也不知道你发来的一串字符是不是有效的 。
同步和异步的区别
1 异步通信没有时钟的约束,同步通信双方的时钟是连在一起的
2 异步通信数据每个时段传输是字符(一个字节)传输的
3 异步通信效率低 同步效率高
4 异步字节传输间隔是随意的 同步通信的字节传输没有间隔
所以说 他们最根本区别在于 同步自带有时钟 异步没有时钟
串口配置简介
串口的基本设置 :就是波特率设置 波特率 其实就是 单片机和串口约定好的频率
就像手机之间的蓝牙连接一样 双方都会有一个约定的密码 配置之后就可以通信了
只要你开串口时钟 设置对应 io模式 数据位长度 检验位 等等信息就行了
硬件展示
软件设计
1)keil配置 生成 hex 文件 因为还是用串口下载器
2)软件下载
这里注意一个地方 如果拔到 boot0的1 还是不行 就按一下 boot1 底下的复位键
代码
用到的结构体成员变量
typedef struct
{
uint32_t USART_BaudRate;
uint16_t USART_WordLength;
uint16_t USART_StopBits;
uint16_t USART_Parity;
uint16_t USART_Mode;
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;
usart1.c
#include "stm32f10x.h"
#include "usart.h"
u8 temp;
void usart_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
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_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate =115200;
USART_InitStruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_StopBits =USART_StopBits_1;
USART_InitStruct.USART_Parity =USART_Parity_No;
USART_InitStruct.USART_WordLength =USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel =USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =3;
NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
接收函数原型和路径
1 我们 在 uasart.h 必须包含 #include<stdio.h>
配置
这个是包含对应的固件库路径的 如果不勾选 32 就找不到他在哪里
rx.c 函数
int fgetc(FILE *stream)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);′
return (int) USART_ReceiveData(USART1);
}
uasart 中断函数+main.c
#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "led.h"
extern u8 temp;
void main(void)
{
usart_init();
led_init();
while(2022);
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
{
temp=USART_ReceiveData(USART1);
if(temp=='1')
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
if(temp=='0')
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
好了 大家加油加油
|