串口我就在这简单的介绍一下我的理解:一个读信号,一个写信号。通过设置波特率,停止位等等选项的保持一致,达到通讯的效果。在双方电压一样的情况,可以不共电,但是必须共地。
话不多说,直接开始代码
usart.h
#ifndef _USART_H_
#define _USART_H_
#include "stm32f10x.h"
#endif
usart.c
#include "usart.h"
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStc; //设置GPIO结构体
USART_InitTypeDef USART_InitStc; //设置USART结构体
NVIC_InitTypeDef NVIC_InitStc; //设置NVIC结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE);
//使能APB2外设时钟
//开始设置相关GPIO
//设置 TX
GPIO_InitStc.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO口的模式:复用推挽输出
GPIO_InitStc.GPIO_Pin = GPIO_Pin_9; //设置GPIO引脚:9
GPIO_InitStc.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO口最高输出速率:推挽输出
GPIO_Init(GPIOA,&GPIO_InitStc); //根据上面的配置初始化GPIO
//设置 RX
GPIO_InitStc.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置GPIO口的模式:浮空输入
GPIO_InitStc.GPIO_Pin = GPIO_Pin_10; //设置GPIO引脚:10
//GPIO_InitStc.GPIO_Speed = GPIO_Speed_50MHz; //因为是输入,无需设置
GPIO_Init(GPIOA,&GPIO_InitStc); //根据上面的配置初始化GPIO
//开始设置相关USART口
USART_InitStc.USART_BaudRate = 115200;
//设置波特率:115200
USART_InitStc.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//设置硬件流控制模式:不使用
USART_InitStc.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
//设置串口模式:收+发
USART_InitStc.USART_Parity = USART_Parity_No;
//设置奇偶模式:不使用
USART_InitStc.USART_StopBits = USART_StopBits_1;
//设置停止位:1
USART_InitStc.USART_WordLength = USART_WordLength_8b;
//设置数据宽度:8位
USART_Init(USART1,&USART_InitStc);
//根据上面的配置初始化USART
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//开启串口接受中断
USART_Cmd(USART1, ENABLE);
//使能串口1
//开始设置中断函数
NVIC_InitStc.NVIC_IRQChannel = USART1_IRQn; //设置IRQ的通道:USART1_IRQn
NVIC_InitStc.NVIC_IRQChannelPreemptionPriority = 3; //设置先占优先级:3
NVIC_InitStc.NVIC_IRQChannelSubPriority = 3; //设置从优先级:3
NVIC_InitStc.NVIC_IRQChannelCmd = ENABLE; //使能设定的IRQ通道
NVIC_Init(&NVIC_InitStc); //根据上面的配置初始化NVIC
}
接下来就是串口中断了,本人的使用的判断方式是:定义一个头,定义一个尾,再自己设置一个长度。
发送和接收都是HEX格式——举例:
u8 USART_RX_BUF[32]; //一个存储数据的区域——将该变量设置位全局变量
int i= 0; //一个临时计数变量
int USART_RX_STA = 0; //接收开始的标志位
int USART_FLAG = 0; //接收完成标志位——将该变量设置位全局变量
void USART1_IRQHandler(void)
{
u8 data; //接收的数据
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//产生中断
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断
data = USART_ReceiveData(USART1); //data等于收到的值
if(USART_RX_STA == 0 && USART_FLAG == 0) //没有开始接收也没有完成接收
{
if(data == 0xA1 ) //如果接收到开头0xA1
{
USART_RX_STA = 1; //接收开始的标志位置1
USART_RX_BUF[0] = data; //data赋值到存储数据的区域的第一位
}
}
else //如果不是上面的情况
{
if(data == 0xA2) //如果接收到0xA2
{
if(i == 4) //并且i计数到4
{
USART_RX_BUF[5] = data; //data赋值到存储数据的区域的第六位
USART_FLAG = 1; //接收完成标志位置1
}
i=0; //i变回0
USART_RX_STA = 0; //接收开始的标志位变为未开始接收
}
else //如果没有收到0xA2
{
i++; //i+1
USART_RX_BUF[i] = data; //data赋值到存储数据的区域的第i位
}
}
}
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) //如果接收数据溢出
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //清除溢出
USART_ReceiveData(USART1); //重新读取
}
}