#一、串口通信介绍
##1、串口通信
串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口通讯是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
##2、串口通信的几种标准
###(1)、R232标准
MAX232芯片是专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。MAX232芯片的作用是将单片机输出的TTL电平转换成PC机能接收的232电平或将PC机输出的232电平转换成单片机能接收的TTL电平。
MAX232芯片适用电路图:(来源于百度)
###(2)、R485标准
SP3485芯片是+3.3V低功耗半双工收发器,适用于RS-485和RS-422串行协议。
SP3485应用电路图如下:
##3、RS232、485电平与TTL电平的区别
RS-232
1、 在RS-232-C中任何一条信号线的电压均为负逻辑关系。
即:逻辑“1”为-3到-15V;逻辑“0”为+3到+15V。
2、 RS-232-C接口连接器一般使用型号为DB-9插头座,通常插头在DCE端,插座在DTE端。PC机的RS-232口为9芯针插座。一些设备与PC机连接的RS-232接口,因为不使用对方的传送控制信号,只需要三条接口线,即“发送数据TXD”、“接收数据RXD”和“信号地GND”。RS-232传输线采用屏蔽双绞线。
RS-485
RS485采用差分信号负逻辑.
逻辑"1"以两线间的电压差为-(2~6)V表示
逻辑"0"以两线间的电压差为+(2~6)V表示。
接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。RS-485的数据最高传输速率为10Mbps。
TTL
TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。
##4、CH340芯片介绍
CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。
在串口方式下,CH340 提供常用的MODEM联络信号。
在红外方式下,CH340 外加红外收发器即可构成USB 红外线适配器。
#二、串口通信小试前准备
##1、硬件准备
STM32F103C8T6最小核心板
USB转TTL
##2、软件及驱动准备
CH340驱动(USB串口驱动)_XP_WIN7共用
串口调试助手XCOM V2.3
CH340驱动
注:CH340驱动安装后在电脑设备管理器查找有无com端口,有即代表安装成功。
#三、串口通信小试代码编写:
代码1:
ustart.c
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
代码2:test.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u16 t; u16 len; u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为115200
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
printf("\r\n Hello Windows! \r\n\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%200==0)printf("Hello Windows!\r\n");
delay_ms(10);
}
}
}
代码编写后进行调试编译,无误后进行烧录:
然后用XCOM观查串口输出:
观察输出成功小试结束。