STM32-RS232通讯软硬件实现

OS:Windows 64异步

Development kit:MDK5.14ide

IDE:UV4spa

MCU:STM32F103C8T6/VET6设计

AD:Altium Designer 18.0.12code

一、RS232简介

  RS232是我的计算机上的通信接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。一般 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,通常我的计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。blog

  接口标准RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数状况下主要使用主通道,对于通常双工通讯,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。接口

  RS-232-C标准规定的数据传输速率为50、7五、100、150、300、600、1200、2400、4800、9600、19200、38400波特。ip

  RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通讯的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被普遍用于计算机串行接口外设链接。链接电缆和机械、电气特性、信号功能及传送过程。ci

二、硬件实现

  芯片选择MAX3232,一个芯片能够实现两个232接口。应用电路如图:input

 

 

  DB9型232接口实现单片机和电脑的链接,前面的电位器用以调节232线路电压,事实上只要不太过度,电位器电阻值并无确切值,但电路设计时建议保留。

三、软件实现

  RS232是全双工通讯,相比485要简单一些。

 1 #include "sys.h"
 2 #include "stdio.h"
 3 
 4 #define        USART1_RX_LEN      50           //接收最大字节
 5 #define        USART1_TX_LEN      50          //发送最大字节
 6 
 7 extern  u8 USART1_RX_Buf[USART1_RX_LEN];  //接收缓冲
 8 extern  u8 USART1_TX_Buf[USART1_TX_LEN];  //发送缓冲
 9 extern  u8 USART1_RX_Data_Len;           //实际接收数据字节长度
10 extern  u8 USART1_TX_Data_Len;           //待发送数据字节长度
11 extern  u8 USART1_RX_Flag;               //是否收到数据
12 
13 void USART1_Config(u32 bound); 14 void USART1_IRQHandler(void); 15 void USART1_Send_Data(u8 *buf,u8 len);
usart1_232.h
 1 #include "sys.h"
 2 #include "usart1.h"
 3 
 4 u8 USART1_RX_Buf[USART1_RX_LEN];  //接收缓冲
 5 u8 USART1_TX_Buf[USART1_TX_LEN];  //发送缓冲
 6 u8 USART1_RX_Data_Len = 0;        //实际接收数据字节长度
 7 u8 USART1_TX_Data_Len = 0;        //待发送数据字节长度
 8 u8 USART1_RX_Flag = 0;            //串口1是否接收完数据
 9 
10 void USART1_IRQHandler(void) 11 { 12  u8 res; 13     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
14  { 15         res =USART_ReceiveData(USART1); //读取接收到的数据
16         if(USART1_RX_Data_Len<USART1_RX_LEN) 17  { 18             USART1_RX_Buf[USART1_RX_Data_Len]=res; //记录接收到的值
19             USART1_RX_Data_Len++; //接收数据增长 1
20  } 21         USART1_RX_Flag=1;   //串口1接收到数据
22  } 23 } 24 
25 void USART1_Config(u32 bound) 26 { 27  GPIO_InitTypeDef GPIO_InitStructure; 28  USART_InitTypeDef USART_InitStructure; 29  NVIC_InitTypeDef NVIC_InitStructure; 30     
31     /*********************配置串口1**************************/
32     
33     /* config USART1 clock */
34  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); 35  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); 36     
37     /* USART1 GPIO config */
38     /* Configure USART1 Tx (PA.02) as alternate function push-pull *///TX
39     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 40     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出
41     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 42     GPIO_Init(GPIOA, &GPIO_InitStructure); 43     /* Configure USART1 Rx (PA.03) as input floating *///RX
44     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 45     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
46     GPIO_Init(GPIOA, &GPIO_InitStructure); 47         
48     /* USART1 mode config */    
49     USART_InitStructure.USART_BaudRate = bound; 50     USART_InitStructure.USART_WordLength = USART_WordLength_8b; 51     USART_InitStructure.USART_StopBits = USART_StopBits_1; 52     USART_InitStructure.USART_Parity = USART_Parity_No ; 53     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 54     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 55     USART_Init(USART1, &USART_InitStructure); 56     
57     /* USART1 接收中断 */
58     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
59     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级 3 级
60     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级 2级
61     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
62     NVIC_Init(&NVIC_InitStructure);//初始化 NVIC 寄存器
63     
64     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断
65     USART_Cmd(USART1, ENABLE); //使能串口
66     
67 } 68 
69 void USART1_Send_Data(u8 *buf,u8 len) 70 { 71  u8 t; 72     for(t=0;t<len;t++) 73  { 74         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 75  USART_SendData(USART1,buf[t]); 76  } 77     while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 78 }
usart1_232.c

  注意:RX设为浮空输入、TX设置为复用推挽输出

相关文章
相关标签/搜索