赞
踩
#一、串口介绍
#二、项目所需硬件
##1.USB转串口模块
#三、项目代码
一、串口介绍
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
通用同步/异步串行接收/发送器
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。
1、单工(Simplex)
单工通信只支持信号在一个方向上传输(正向或反向),任何时候不能改变信号的传输方向。
2、半双工(Half Duplex)
半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输。半双工通信实际上是一种可切换方向的单工通信。
3、全双工(Full Duplex)
全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。全双工通信是两个单工通信方式的结合,要求收发双方都有独立的接收和发送能力。
TTL电平:数字芯片的电平,单片机。(电压范围:0V~5V)
232电平:电脑串口的电平,负逻辑。(电压范围:-15V~15V)
1.USB转串口模块主要应用于电脑与其他设备的连接,使用的时候电脑需要安装电平转换芯片驱动。
USB转串口模块示意图,如图。
2.原生串口通信主要用于设备与传感器的连接,不需要经过电平转换芯片直接用TTL电平通信,如GPS模块,串口转WIFI模块(ESP8266),蓝牙模块(HC05)
3.串口数据包的基本组成:起始位、有效数据位,校验位和停止位
4.串口数据包校验位
5.**USART:**通用同步异步收发器
6.USART引脚位置:
PA10/USART1_RX
PA9/USART1_TX
PA8/USART1_CLK
7.串口的结构体配置
8.串口初始化函数
二、项目所需硬件
1、STM32F103C8T6开发板
串口的配置:
1.电源——VCC3.3V
2.接地——GND
3.输出端——TX(PA9)
4.输入端——RX(PA10)
2、USB转串口模块
接线配置:
1.电源:3.3V——3.3V
2.接地:GND——GND
3.输出:TXD——RX(PA10)
4.输入:RXD——TX(PA9)
三、项目代码
1.main.c
#include "stm32f10x.h" #include "main.h" #include "LED.h" #include "usart.h" #include "relay.h" #include "shake.h" #include "exti.h" void delay(uint16_t time)//延迟函数 { uint16_t i=0; while(time--) { i=12000; while(i--); } } int main() { usart_init(); LED_Init(); GPIO_SetBits(GPIOA, GPIO_Pin_1); //USART_SendData(USART1, 'O'); //USART_SendData(USART1, 'K'); //USARTSendStr(USART1,"狗崽崽的bb叫燕贤"); //printf("狗崽崽的bb叫燕贤"); while(1) { } } void USART1_IRQHandler(void)//串口1中断响应函数 { char Temp;//定义一个变量 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生中断 { Temp=USART_ReceiveData(USART1); if(Temp=='O') { GPIO_ResetBits(GPIOA,GPIO_Pin_1); USARTSendStr(USART1, "LED is OK"); } if(Temp=='C') { GPIO_SetBits(GPIOA, GPIO_Pin_1); USARTSendStr(USART1, "LED is Down"); } } }
USART.C
#include "stm32f10x.h" #include "usart.h" #include <stdio.h> void usart_init(void)//串口初始化 { GPIO_InitTypeDef gpioinstructure;//GPIO结构体初始化函数 USART_InitTypeDef usartinstructure;//USART结构体初始化函数 NVIC_InitTypeDef nvicinstructure;//中断控制器结构体初始化函数 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断控制器优先抢占级组 //1.配置GPIO、USART、引脚复用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置引脚复用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART时钟 //2.配置GPIO结构体 //配置PA9 TX 输出引脚 gpioinstructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 gpioinstructure.GPIO_Pin = GPIO_Pin_9 ;//引脚9 gpioinstructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50Mhz GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化 //配置PA10 RX 接收引脚 gpioinstructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输出 gpioinstructure.GPIO_Pin = GPIO_Pin_10;//引脚10 GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化 //3.配置串口的结构体 usartinstructure.USART_BaudRate = 115200;//波特率为115200 usartinstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流配置 usartinstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx ;//接收模式 usartinstructure.USART_Parity = USART_Parity_No;//无校验位 usartinstructure.USART_StopBits = USART_StopBits_1;//一个停止位 usartinstructure.USART_WordLength = USART_WordLength_8b;//有效数据位为8位 USART_Init(USART1,&usartinstructure);//初始化串口1 USART_Cmd(USART1,ENABLE); //使能串口1 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断配置 //4.配置中断控制器的结构 nvicinstructure.NVIC_IRQChannel = USART1_IRQn;//中断通道 nvicinstructure.NVIC_IRQChannelCmd = ENABLE; //通道使能 nvicinstructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级配置为1 nvicinstructure.NVIC_IRQChannelSubPriority = 1;//子优先级配置为1 NVIC_Init(&nvicinstructure);//中断控制器初始化 } //发送字符 void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)//发送字符 { USART_SendData(USARTx, Data); while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET); } //发送字符串 void USARTSendStr(USART_TypeDef* USARTx, char *str) { uint16_t i=0; do { USARTSendByte(USARTx,*(str+i)); i++; }while(*(str+i)!='\0'); while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET); } int fputc(int ch,FILE *f)//printf函数的重映射 { USART_SendData(USART1,(uint8_t)ch);//发送 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//发送数据寄存器空标志位判断 return (ch); } int fgetc(FILE *f)//printf函数的重映射 { while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//接收数据寄存器非空标志位判断 return (int)USART_ReceiveData(USART1);//返回接收到的字符 }
usart.h
#include "stm32f10x.h"
#include <stdio.h>
void usart_init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendStr(USART_TypeDef* USARTx, char *str);
led.c
#include "LED.h" #include "stm32f10x.h" void LED_Init(void) { GPIO_InitTypeDef LED_Init; //1.使能ABP2的时钟GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //2.结构体配置 LED_Init.GPIO_Mode = GPIO_Mode_Out_PP; LED_Init.GPIO_Pin = GPIO_Pin_1; LED_Init.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &LED_Init); }
led.h
```c
#include "stm32f10x.h"
void LED_Init(void);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。