OS:Windows 64異步
Development kit:MDK5.14ide
IDE:UV4spa
MCU:STM32F103C8T6/VET6設計
AD:Altium Designer 18.0.12code
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);
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 }
注意:RX設爲浮空輸入、TX設置爲複用推輓輸出