1、RS232简介 RS232是个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,一般个人计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。 接口标准RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。 RS-232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。 RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。连接电缆和机械、电气特性、信号功能及传送过程。
2、硬件实现芯片选择MAX3232,一个芯片可以实现两个232接口。应用电路如图:
DB9型232接口实现单片机和电脑的连接,前面的电位器用以调节232线路电压,事实上只要不太过分,电位器电阻值并没有确切值,但电路设计时建议保留。
3、软件实现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设置为复用推挽输出
|