本章參考資料:《STM32F4xx中文參考手冊(cè)》USART章節(jié)。
學(xué)習(xí)本章時(shí),配合本書前面的《USART—串口通訊》及《CAN—通訊實(shí)驗(yàn)》章節(jié)進(jìn)行對(duì)比學(xué)習(xí),效果更佳。
關(guān)于實(shí)驗(yàn)板中使用的MAX485收發(fā)器資料可查閱《MAX485》規(guī)格書了解。
41.1 RS-485通訊協(xié)議簡介
與CAN類似,RS-485是一種工業(yè)控制環(huán)境中常用的通訊協(xié)議,它具有抗干擾能力強(qiáng)、傳輸距離遠(yuǎn)的特點(diǎn)。RS-485通訊協(xié)議由RS-232協(xié)議改進(jìn)而來,協(xié)議層不變,只是改進(jìn)了物理層,因而保留了串口通訊協(xié)議應(yīng)用簡單的特點(diǎn)。
41.1.1 RS-485的物理層
從《CAN—通訊實(shí)驗(yàn)》章節(jié)中了解到,差分信號(hào)線具有很強(qiáng)的干擾能力,特別適合應(yīng)用于電磁環(huán)境復(fù)雜的工業(yè)控制環(huán)境中,RS-485協(xié)議主要是把RS-232的信號(hào)改進(jìn)成差分信號(hào),從而大大提高了抗干擾特性,它的通訊網(wǎng)絡(luò)示意圖見圖 411。
圖 411 RS-485通訊網(wǎng)絡(luò)示意圖
對(duì)比CAN通訊網(wǎng)絡(luò),可發(fā)現(xiàn)它們的網(wǎng)絡(luò)結(jié)構(gòu)組成是類似的,每個(gè)節(jié)點(diǎn)都是由一個(gè)通訊控制器和一個(gè)收發(fā)器組成,在RS-485通訊網(wǎng)絡(luò)中,節(jié)點(diǎn)中的串口控制器使用RX與TX信號(hào)線連接到收發(fā)器上,而收發(fā)器通過差分線連接到網(wǎng)絡(luò)總線,串口控制器與收發(fā)器之間一般使用TTL信號(hào)傳輸,收發(fā)器與總線則使用差分信號(hào)來傳輸。發(fā)送數(shù)據(jù)時(shí),串口控制器的TX信號(hào)經(jīng)過收發(fā)器轉(zhuǎn)換成差分信號(hào)傳輸?shù)娇偩€上,而接收數(shù)據(jù)時(shí),收發(fā)器把總線上的差分信號(hào)轉(zhuǎn)化成TTL信號(hào)通過RX引腳傳輸?shù)酱诳刂破髦小?p>
RS-485通訊網(wǎng)絡(luò)的最大傳輸距離可達(dá)1200米,總線上可掛載128個(gè)通訊節(jié)點(diǎn),而由于RS-485網(wǎng)絡(luò)只有一對(duì)差分信號(hào)線,它使用差分信號(hào)來表達(dá)邏輯,當(dāng)AB兩線間的電壓差為-6V~-2V時(shí)表示邏輯1,當(dāng)電壓差為+2V~+6V表示邏輯0,在同一時(shí)刻只能表達(dá)一個(gè)信號(hào),所以它的通訊是半雙工形式的,它與RS-232通訊協(xié)議的特性對(duì)比見圖 411。
表 411 RS-232/422/485 標(biāo)準(zhǔn)對(duì)比
RS-485與RS-232的差異只體現(xiàn)在物理層上,它們的協(xié)議層是相同的,也是使用串口數(shù)據(jù)包的形式傳輸數(shù)據(jù)。而由于RS-485具有強(qiáng)大的組網(wǎng)功能,人們?cè)诨A(chǔ)協(xié)議之上還制定了MODBUS協(xié)議,被廣泛應(yīng)用在工業(yè)控制網(wǎng)絡(luò)中。此處說的基礎(chǔ)協(xié)議是指前面串口章節(jié)中講解的,僅封裝了基本數(shù)據(jù)包格式的協(xié)議(基于數(shù)據(jù)位),而MODBUS協(xié)議是使用基本數(shù)據(jù)包組合成通訊幀格式的高層應(yīng)用協(xié)議(基于數(shù)據(jù)包或字節(jié))。感興趣的讀者可查找MODBUS協(xié)議的相關(guān)資料了解。
由于RS-485與RS-232的協(xié)議層沒有區(qū)別,進(jìn)行通訊時(shí),我們同樣是使用STM32的USART外設(shè)作為通訊節(jié)點(diǎn)中的串口控制器,再外接一個(gè)RS-485收發(fā)器芯片把USART外設(shè)的TTL電平信號(hào)轉(zhuǎn)化成RS-485的差分信號(hào)即可。
41.2 RS-485—雙機(jī)通訊實(shí)驗(yàn)
本小節(jié)演示如何使用STM32的USART控制器與MAX485收發(fā)器,在兩個(gè)設(shè)備之間使用RS-485協(xié)議進(jìn)行通訊,本實(shí)驗(yàn)中使用了兩個(gè)實(shí)驗(yàn)板,無法像CAN實(shí)驗(yàn)?zāi)菢邮褂没丨h(huán)測(cè)試(把STM32 USART外設(shè)的TXD引腳使用杜邦線連接到RXD引腳可進(jìn)行自收發(fā)測(cè)試,不過這樣的通訊不經(jīng)過RS-485收發(fā)器,跟普通TTL串口實(shí)驗(yàn)沒有區(qū)別),本教程主要以"USART—485通訊"工程進(jìn)行講解。
41.2.1 硬件設(shè)計(jì)
圖 412 雙CAN通訊實(shí)驗(yàn)硬件連接圖
圖 4016中的是兩個(gè)實(shí)驗(yàn)板的硬件連接。在單個(gè)實(shí)驗(yàn)板中,作為串口控制器的STM32從USART外設(shè)引出TX和RX兩個(gè)引腳與RS-485收發(fā)器MAX485相連,收發(fā)器使用它的A和B引腳連接到RS-485總線網(wǎng)絡(luò)中。為了方便使用,我們每個(gè)實(shí)驗(yàn)板引出的A和B之間都連接了1個(gè)120歐的電阻作為RS-485總線的端電阻,所以要注意如果您要把實(shí)驗(yàn)板作為一個(gè)普通節(jié)點(diǎn)連接到現(xiàn)有的RS-485總線時(shí),是不應(yīng)添加該電阻的!
由于485只能以半雙工的形式工作,所以需要切換狀態(tài),MAX485芯片中有"RE"和"DE"兩個(gè)引腳,用于控制485芯片的收發(fā)工作狀態(tài)的,當(dāng)RE引腳為低電平時(shí),485芯片處于接收狀態(tài),當(dāng)DE引腳為高電平時(shí)芯片處于發(fā)送狀態(tài)。實(shí)驗(yàn)板中使用了STM32的PD11直接連接到這兩個(gè)引腳上,所以通過控制PD11的輸出電平即可控制485的收發(fā)狀態(tài)。
要注意的是,由于我們的實(shí)驗(yàn)板485使用的信號(hào)線與液晶屏共用了,為防止干擾,平時(shí)我們默認(rèn)是不給485收發(fā)器供電的,使用485的時(shí)候一定要把485接線端子旁邊的"C/4-5V"排針使用跳線帽與"5V"排針連接起來進(jìn)行供電,并且把液晶屏從板子上拔下來;而又由于實(shí)驗(yàn)板的RS-232與RS-485通訊實(shí)驗(yàn)都使用STM32的同一個(gè)USART外設(shè)及收發(fā)引腳,實(shí)驗(yàn)時(shí)注意必須要把STM32的"PD5引腳"與MAX485的"485_D"及"PD6"與"485_R"使用跳線帽連接起來(這些信號(hào)都在485接線端子旁邊的排針上)。
要實(shí)現(xiàn)通訊,我們還要使用導(dǎo)線把實(shí)驗(yàn)板引出的A和B兩條總線連接起來,才能構(gòu)成完整的網(wǎng)絡(luò)。實(shí)驗(yàn)板之間A與A連接,B與B連接即可。
41.2.2 軟件設(shè)計(jì)
為了使工程更加有條理,我們把RS485控制相關(guān)的代碼獨(dú)立分開存儲(chǔ),方便以后移植。在"串口實(shí)驗(yàn)"之上新建"bsp_485.c"及"bsp_485.h"文件,這些文件也可根據(jù)您的喜好命名,它們不屬于STM32標(biāo)準(zhǔn)庫的內(nèi)容,是由我們自己根據(jù)應(yīng)用需要編寫的。這個(gè)實(shí)驗(yàn)的底層STM32驅(qū)動(dòng)與串口控制區(qū)別不大,上層實(shí)驗(yàn)功能上與CAN實(shí)驗(yàn)類似。
1. 編程要點(diǎn)
(1) 初始化485通訊使用的USART外設(shè)及相關(guān)引腳;
(2) 編寫控制MAX485芯片進(jìn)行收發(fā)數(shù)據(jù)的函數(shù);
(3) 編寫測(cè)試程序,收發(fā)數(shù)據(jù)。
2. 代碼分析
485硬件相關(guān)宏定義
我們把485硬件相關(guān)的配置都以宏的形式定義到"bsp_485.h"文件中,見代碼清單 242。
代碼清單 411 485硬件配置相關(guān)的宏(bsp_485.h文件)
1 /*USART號(hào)、時(shí)鐘、波特率*/
2 #define RS485_USART USART2
3 #define RS485_USART_CLK RCC_APB1Periph_USART2
4 #define RS485_USART_BAUDRATE 115200
5
6 /*RX引腳*/
7 #define RS485_USART_RX_GPIO_PORT GPIOD
8 #define RS485_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
9 #define RS485_USART_RX_PIN GPIO_Pin_6
10 #define RS485_USART_RX_AF GPIO_AF_USART2
11 #define RS485_USART_RX_SOURCE GPIO_PinSource6
12
13 /*TX引腳*/
14 #define RS485_USART_TX_GPIO_PORT GPIOD
15 #define RS485_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
16 #define RS485_USART_TX_PIN GPIO_Pin_5
17 #define RS485_USART_TX_AF GPIO_AF_USART2
18 #define RS485_USART_TX_SOURCE GPIO_PinSource5
19
20 /*485收發(fā)控制引腳*/
21 #define RS485_RE_GPIO_PORT GPIOD
22 #define RS485_RE_GPIO_CLK RCC_AHB1Periph_GPIOD
23 #define RS485_RE_PIN GPIO_Pin_11
24
25 /*中斷相關(guān)*/
26 #define RS485_INT_IRQ USART2_IRQn
27 #define RS485_IRQHandler USART2_IRQHandler
以上代碼根據(jù)硬件連接,把與485通訊使用的USART外設(shè)號(hào)、引腳號(hào)、引腳源以及復(fù)用功能映射都以宏封裝起來,并且定義了接收中斷的中斷向量和中斷服務(wù)函數(shù),我們通過中斷來獲知接收數(shù)據(jù)。
初始化485的USART配置
利用上面的宏,編寫485的USART初始化函數(shù),見代碼清單 243。
代碼清單 412 RS485的初始化函數(shù)(bsp_485.c文件)
1
2 /*
3 * 函數(shù)名:RS485_Config
4 * 描述:USART GPIO 配置,工作模式配置
5 * 輸入:無
6 * 輸出 : 無
7 * 調(diào)用:外部調(diào)用
8 */
9 void RS485_Config(void)
10 {
11 GPIO_InitTypeDef GPIO_InitStructure;
12 USART_InitTypeDef USART_InitStructure;
13
14 /* 配置 USART時(shí)鐘 */
15 RCC_AHB1PeriphClockCmd(RS485_USART_RX_GPIO_CLK|
16 RS485_USART_TX_GPIO_CLK|
17 RS485_RE_GPIO_CLK, ENABLE);
18 RCC_APB1PeriphClockCmd(RS485_USART_CLK, ENABLE);
19
20 /* TX 引腳源*/
21 GPIO_PinAFConfig(RS485_USART_RX_GPIO_PORT,RS485_USART_RX_SOURCE, RS485_USART_RX_AF);
22
23 /* RX 引腳源*/
24 GPIO_PinAFConfig(RS485_USART_TX_GPIO_PORT,RS485_USART_TX_SOURCE,RS485_USART_TX_AF);
25
26 /* USART GPIO配置 */
27 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
28 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
29 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
30 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
31
32 /*TX*/
33 GPIO_InitStructure.GPIO_Pin = RS485_USART_TX_PIN;
34 GPIO_Init(RS485_USART_TX_GPIO_PORT, &GPIO_InitStructure);
35
36 /*RX */
37 GPIO_InitStructure.GPIO_Pin = RS485_USART_RX_PIN;
38 GPIO_Init(RS485_USART_RX_GPIO_PORT, &GPIO_InitStructure);
39
40 /* 485收發(fā)控制管腳 */
41 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
42 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
43 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
44 GPIO_InitStructure.GPIO_Pin = RS485_RE_PIN ;
45 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
46 GPIO_Init(RS485_RE_GPIO_PORT, &GPIO_InitStructure);
47
48 /* USART 模式配置*/
49 USART_InitStructure.USART_BaudRate = RS485_USART_BAUDRATE;
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
56 USART_Init(RS485_USART, &USART_InitStructure);
57 /*使能USART*/
58 USART_Cmd(RS485_USART, ENABLE);
59
60 /*配置中斷優(yōu)先級(jí)*/
61 NVIC_Configuration();
62 /* 使能串口接收中斷 */
63 USART_ITConfig(RS485_USART, USART_IT_RXNE, ENABLE);
64
65 /*控制485芯片進(jìn)入接收模式*/
66 GPIO_ResetBits(RS485_RE_GPIO_PORT,RS485_RE_PIN);
67 }
與所有使用到GPIO的外設(shè)一樣,都要先把使用到的GPIO引腳模式初始化,配置好復(fù)用功能,其中用于控制MAX485芯片的收發(fā)狀態(tài)的引腳被初始化成普通推挽輸出模式,以便手動(dòng)控制它的電平輸出,切換狀態(tài)。485使用到的USART也需要配置好波特率、有效字長、停止位及校驗(yàn)位等基本參數(shù),在通訊中,兩個(gè)485節(jié)點(diǎn)的串口參數(shù)應(yīng)一致,否則會(huì)導(dǎo)致通訊解包錯(cuò)誤。在實(shí)驗(yàn)中還使能了串口的接收中斷功能,當(dāng)檢測(cè)到新的數(shù)據(jù)時(shí),進(jìn)入中斷服務(wù)函數(shù)中獲取數(shù)據(jù)。
使用中斷接收數(shù)據(jù)
接下來我們編寫在USART中斷服務(wù)函數(shù)中接收數(shù)據(jù)的相關(guān)過程,見代碼清單 244,其中的bsp_RS485_IRQHandler函數(shù)直接被bsp_stm32f4xx_it.c文件的USART中斷服務(wù)函數(shù)調(diào)用,不在此列出。
代碼清單 413 中斷接收數(shù)據(jù)的過程(bsp_485.c文件)
1 //中斷緩存串口數(shù)據(jù)
2 #define UART_BUFF_SIZE 1024
3 volatile uint16_t uart_p = 0;
4 uint8_t uart_buff[UART_BUFF_SIZE];
5
6 void bsp_RS485_IRQHandler(void)
7 {
8 if (uart_p 9 if (USART_GetITStatus(RS485_USART, USART_IT_RXNE) != RESET) { 10 uart_buff[uart_p] = USART_ReceiveData(RS485_USART); 11 uart_p++; 12 13 USART_ClearITPendingBit(RS485_USART, USART_IT_RXNE); 14 } 15 } else { 16 USART_ClearITPendingBit(RS485_USART, USART_IT_RXNE); 17 } 18 } 19 20 //獲取接收到的數(shù)據(jù)和長度 21 char *get_rebuff(uint16_t *len) 22 { 23 *len = uart_p; 24 return (char *)&uart_buff; 25 } 26 27 //清空緩沖區(qū) 28 void clean_rebuff(void) 29 { 30 uint16_t i=UART_BUFF_SIZE+1; 31 uart_p = 0; 32 while (i) 33 uart_buff[--i]=0; 34 } 這個(gè)數(shù)據(jù)接收過程主要思路是使用了接收緩沖區(qū),當(dāng)USART有新的數(shù)據(jù)引起中斷時(shí),調(diào)用庫函數(shù)USART_ReceiveData把新數(shù)據(jù)讀取到緩沖區(qū)數(shù)組uart_buff中,其中g(shù)et_rebuff函數(shù)可以用于獲緩沖區(qū)中有效數(shù)據(jù)的長度,而clean_rebuff函數(shù)可以用于對(duì)緩沖區(qū)整體清0,這些函數(shù)配合使用,實(shí)現(xiàn)了簡單的串口接收緩沖機(jī)制。這部分串口數(shù)據(jù)接收的過程跟485收發(fā)器無關(guān),是串口協(xié)議通用的。 切換收發(fā)狀態(tài) 在前面我們了解到RS-485是半雙工通訊協(xié)議,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)需要分時(shí)進(jìn)行,所以需要經(jīng)常切換收發(fā)狀態(tài)。而MAX485收發(fā)器根據(jù)其"RE"和"DE"引腳的外部電平信號(hào)切換收發(fā)狀態(tài),所以控制與其相連的STM32普通IO電平即可控制收尾,為簡便起見,我們把收發(fā)狀態(tài)切換定義成了宏,見代碼清單 245。 代碼清單 414 切換收發(fā)狀態(tài)(bsp_485.h文件) 1 /// 簡單的延時(shí) 2 static void RS485_delay(__IO u32 nCount) 3 { 4 for (; nCount != 0; nCount--); 5 } 6 7 /*控制收發(fā)引腳*/ 8 //進(jìn)入接收模式,必須要有延時(shí)等待485處理完數(shù)據(jù) 9 #define RS485_RX_EN() RS485_delay(1000); 10 GPIO_ResetBits(RS485_RE_GPIO_PORT,RS485_RE_PIN); 11 RS485_delay(1000); 12 //進(jìn)入發(fā)送模式,必須要有延時(shí)等待485處理完數(shù)據(jù) 13 #define RS485_TX_EN() RS485_delay(1000); 14 GPIO_SetBits(RS485_RE_GPIO_PORT,RS485_RE_PIN); 15 RS485_delay(1000); 16 這兩個(gè)宏中,主要是在控制電平輸出前后加了一小段時(shí)間延時(shí),這是為了給MAX485芯片預(yù)留響應(yīng)時(shí)間,因?yàn)镾TM32的引腳狀態(tài)電平變換后,MAX485芯片可能存在響應(yīng)延時(shí)。例如,當(dāng)STM32控制自己的引腳電平輸出高電平(控制成發(fā)送狀態(tài)),然后立即通過TX信號(hào)線發(fā)送數(shù)據(jù)給MAX485芯片,而MAX485芯片由于狀態(tài)不能馬上切換,會(huì)導(dǎo)致丟失了部分STM32傳送過來的數(shù)據(jù),造成錯(cuò)誤。 發(fā)送數(shù)據(jù) STM32使用485發(fā)送數(shù)據(jù)的過程也與普通的USART發(fā)送數(shù)據(jù)過程差不多,我們定義了一個(gè)RS485_SendByte函數(shù)來發(fā)送一個(gè)字節(jié)的數(shù)據(jù)內(nèi)容,見代碼清單 246。 代碼清單 415 發(fā)送數(shù)據(jù)(bsp_485.c文件) 1 2 /***************** 發(fā)送一個(gè)字符 **********************/ 3 //使用單字節(jié)數(shù)據(jù)發(fā)送前要使能發(fā)送引腳,發(fā)送后要使能接收引腳。 4 void RS485_SendByte( uint8_t ch ) 5 { 6 /* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)到USART1 */ 7 USART_SendData(RS485_USART,ch); 8 /* 等待發(fā)送完畢 */ 9 while (USART_GetFlagStatus(RS485_USART, USART_FLAG_TXE) == RESET); 10 11 } 12 上述代碼中就是直接調(diào)用了STM32庫函數(shù)USART_SendData把要發(fā)送的數(shù)據(jù)寫入到USART的數(shù)據(jù)寄存器,然后檢查標(biāo)志位等待發(fā)送完成。 在調(diào)用RS485_SendByte 函數(shù)前,需要先使用前面提到的切換收發(fā)狀態(tài)宏,把MAX485切換到發(fā)送模式,STM32發(fā)出的數(shù)據(jù)才能正常傳輸?shù)?85網(wǎng)絡(luò)總線上,當(dāng)發(fā)送完數(shù)據(jù)的時(shí)候,應(yīng)重新把MAX485切換回接收模式,以便獲取網(wǎng)絡(luò)總線上的數(shù)據(jù)。 3. main函數(shù) 最后我們來閱讀main函數(shù),了解整個(gè)通訊過程,見代碼清單 2414。這個(gè)main函數(shù)的整體設(shè)計(jì)思路是,實(shí)驗(yàn)板檢測(cè)自身的按鍵狀態(tài),若按鍵被按下,則通過485發(fā)送256個(gè)測(cè)試數(shù)據(jù)到網(wǎng)絡(luò)總線上,若自身接收到總線上的256個(gè)數(shù)據(jù),則把這些數(shù)據(jù)作為調(diào)試信息打印到電腦端。所以,如果把這樣的程序分別應(yīng)用到485總線上的兩個(gè)通訊節(jié)點(diǎn)時(shí),就可以通過按鍵控制互相發(fā)送數(shù)據(jù)了。 代碼清單 416 main函數(shù) 1 2 /** 3 * @brief 主函數(shù) 4 * @param 無 5 * @retval 無 6 */ 7 int main(void) 8 { 9 10 char *pbuf; 11 uint16_t len; 12 13 LED_GPIO_Config(); 14 15 /*初始化USART1*/ 16 Debug_USART_Config(); 17 18 /*初始化485使用的串口,使用中斷模式接收*/ 19 RS485_Config(); 20 21 LED_BLUE; 22 23 Key_GPIO_Config(); 24 25 printf("rn歡迎使用秉火 STM32 F429 開發(fā)板。rn"); 26 printf("rn秉火F429 485通訊實(shí)驗(yàn)例程rn"); 27 28 printf("rn實(shí)驗(yàn)步驟:rn"); 29 30 printf("rn 1.使用導(dǎo)線連接好兩個(gè)485通訊設(shè)備rn"); 31 printf("rn 2.使用跳線帽連接好:5v --- C/4-5V,485-D --- PD5,485-R ---PD6 rn"); 32printf("rn 3.若使用兩個(gè)秉火開發(fā)板進(jìn)行實(shí)驗(yàn),給兩個(gè)開發(fā)板都下載本程序即可。rn"); 33 printf("rn 4.準(zhǔn)備好后,按下其中一個(gè)開發(fā)板的KEY1鍵,會(huì)使用485向外發(fā)送0-255的數(shù)字 rn"); 34 printf("rn 5.若開發(fā)板的485接收到256個(gè)字節(jié)數(shù)據(jù),會(huì)把數(shù)據(jù)以16進(jìn)制形式打印出來。 rn"); 35 36 while (1) { 37 /*按一次按鍵發(fā)送一次數(shù)據(jù)*/ 38 if ( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON) { 39 uint16_t i; 40 LED_BLUE; 41 //切換到發(fā)送狀態(tài) 42 RS485_TX_EN(); 43 44 for (i=0; i<=0xff; i++) { 45 RS485_SendByte(i); //發(fā)送數(shù)據(jù) 46 } 47 48 /*加短暫延時(shí),保證485發(fā)送數(shù)據(jù)完畢*/ 49 Delay(0xFFF); 50 RS485_RX_EN();//切換回接收狀態(tài) 51 52 LED_GREEN; 53 printf("rn發(fā)送數(shù)據(jù)成功!rn"); //使用調(diào)試串口打印調(diào)試信息到終端 54 55 } else { 56 LED_BLUE; 57 58 pbuf = get_rebuff(&len); 59 if (len>=256) { 60 LED_GREEN; 61 printf("rn接收到長度為%d的數(shù)據(jù)rn",len); 62 RS485_DEBUG_ARRAY((uint8_t*)pbuf,len); 63 clean_rebuff(); 64 } 65 } 66 } 67 } 在main函數(shù)中,首先初始化了LED、按鍵以及調(diào)試使用的串口,再調(diào)用前面分析的RS485_Config函數(shù)初始化了RS-485通訊使用的串口工作模式。 初始化后485就進(jìn)入了接收模式,當(dāng)接收到數(shù)據(jù)的時(shí)候會(huì)進(jìn)入中斷并把數(shù)據(jù)存儲(chǔ)到接收緩沖數(shù)組中,我們?cè)趍ain函數(shù)的while循環(huán)中(else部分)調(diào)用get_rebuff來查看該緩沖區(qū)的狀態(tài),若接收到256個(gè)數(shù)據(jù)就把這些數(shù)據(jù)通過調(diào)試串口打印到電腦端,然后清空緩沖區(qū)。
上一篇:第42章 電源管理—實(shí)現(xiàn)低功耗—零死角玩轉(zhuǎn)STM32-F429系列
下一篇:第25章 串行FLASH文件系統(tǒng)FatFs—零死角玩轉(zhuǎn)STM32-F429系列
推薦閱讀
史海拾趣
C&D公司自創(chuàng)立之初,就專注于電子技術(shù)的研發(fā)與創(chuàng)新。創(chuàng)始團(tuán)隊(duì)?wèi){借深厚的行業(yè)經(jīng)驗(yàn)和前瞻性的市場(chǎng)洞察力,成功開發(fā)出一系列具有競爭力的電子產(chǎn)品。在市場(chǎng)競爭激烈的背景下,C&D公司憑借卓越的產(chǎn)品性能和精準(zhǔn)的市場(chǎng)定位,迅速在行業(yè)中嶄露頭角。
C&D公司深知品質(zhì)是企業(yè)的生命線,因此始終堅(jiān)守品質(zhì)至上的原則。公司建立了嚴(yán)格的質(zhì)量管理體系,從原材料采購到生產(chǎn)制造,再到產(chǎn)品出廠,每一個(gè)環(huán)節(jié)都嚴(yán)格把控,確保產(chǎn)品的品質(zhì)達(dá)到最高標(biāo)準(zhǔn)。同時(shí),C&D公司還注重品牌建設(shè),通過廣告宣傳、社交媒體營銷等方式,提升品牌知名度和美譽(yù)度。
DIOFIT公司自創(chuàng)立之初,便面臨著激烈的市場(chǎng)競爭和技術(shù)挑戰(zhàn)。創(chuàng)始人團(tuán)隊(duì)?wèi){借對(duì)電子技術(shù)的深入理解和熱情,決心打造一家專注于高端電子產(chǎn)品研發(fā)和生產(chǎn)的企業(yè)。在資金緊張、人才匱乏的情況下,他們堅(jiān)持自主研發(fā),不斷優(yōu)化產(chǎn)品設(shè)計(jì),最終成功推出了一款具有創(chuàng)新性的智能家居控制系統(tǒng),贏得了市場(chǎng)的認(rèn)可,為公司的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
在快速發(fā)展的過程中,DCCOM公司始終堅(jiān)持品質(zhì)至上的原則。公司建立了一套嚴(yán)格的質(zhì)量控制體系,從原材料采購到產(chǎn)品生產(chǎn)的每一個(gè)環(huán)節(jié)都嚴(yán)格把關(guān)。這種對(duì)品質(zhì)的執(zhí)著追求,使得DCCOM的產(chǎn)品在市場(chǎng)上贏得了良好的口碑,客戶回頭率逐年攀升。
Fanstel公司深知人才是企業(yè)發(fā)展的關(guān)鍵因素。因此,公司一直注重人才的培養(yǎng)和引進(jìn)。公司建立了完善的人才培養(yǎng)機(jī)制,為員工提供各種培訓(xùn)和學(xué)習(xí)機(jī)會(huì),幫助他們提升自身素質(zhì)和能力。同時(shí),F(xiàn)anstel還積極引進(jìn)高端人才,打造了一支具有豐富經(jīng)驗(yàn)和專業(yè)技能的研發(fā)團(tuán)隊(duì)。這些人才的加入為公司的技術(shù)創(chuàng)新和產(chǎn)品研發(fā)提供了有力支持。
KeilC51使用詳解V1.0 第一章 Keil C51開發(fā)系統(tǒng)基本知識(shí) 第二章 Keil C51軟件使用詳解 第三章 Keil C51 vs 標(biāo)準(zhǔn)C 第四章 Keil C51高級(jí)編程 第五章 ...… 查看全部問答∨ |
|
如何定制一個(gè)和Windows Mobile 6.0功能相同的系統(tǒng) 如何定制一個(gè)和Windows Mobile 6.0功能相同的系統(tǒng)出來? 希望高手能說明一下! 先感謝了!… 查看全部問答∨ |
|
OV9650寄存器設(shè)置---將圖像左右顛倒---高分啊 有友善之臂的miniarm2440的ov9650cmos camera驅(qū)動(dòng),想要實(shí)現(xiàn)顯示的圖像左右顛倒,說不明白了,就跟照鏡子似的, ,{0x18,0xc6},{0x17,0x26},{0x32,0xa ...… 查看全部問答∨ |
我用的是PB5.0,輸入法已經(jīng)添加進(jìn)去,并生成了鏡像。 可是輸入法是灰色的,右下角的“中”字和“半”字都是灰色的,打出來的字仍然是英文字母。 比如新建一個(gè)文件夾,重命名的時(shí)候,無法出現(xiàn)中文。 奇怪的是,打開記事本,就可以輸入中文,有朋友 ...… 查看全部問答∨ |
我的是手持機(jī),需要AD 采樣電池電壓,現(xiàn)在發(fā)現(xiàn)我的 AD采樣很不穩(wěn)定,我是連續(xù)采了10次去掉最大最小求平均的~,結(jié)果值還是跳來跳去~~~~怎么回事啊… 查看全部問答∨ |
|
用EZ430RF5137-433開發(fā)板,使用SIMPLIC TI協(xié)議組網(wǎng) 我是一個(gè)新手,緊急求助大家,謝謝了, 我用的開發(fā)板是EZ430RF5137-433.使用的協(xié)議是SIMPLIC TI 協(xié)議,我現(xiàn)在想用它實(shí)現(xiàn)測(cè)各個(gè)節(jié)點(diǎn)溫度,然后把測(cè)得的溫度值傳到中心節(jié)點(diǎn)。但是我不知道在哪編寫采集溫度的程序啊,我下面把我按在SIMPLIC TI協(xié)議的 ...… 查看全部問答∨ |
這篇文檔會(huì)主要選擇些API講解,讀者可以對(duì)著代碼仔細(xì)理解。 1 RAW_U16 raw_task_create(RAW_TASK_OBJ *task_obj, RAW_U8 *task_name, RAW_VOID *task_arg, &nbs ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會(huì)成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- 利用人工智能提升車間生產(chǎn)效率
- 方案分享 | ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 車載SerDes產(chǎn)業(yè)起飛!國產(chǎn)新品密集炸場(chǎng)
- 出貨量激增1.34倍! 5G車規(guī)模組成標(biāo)配,三大廠商新品同臺(tái)競技
- 6月新能源市場(chǎng):零跑創(chuàng)新高;比亞迪海外突破;理想滑坡
- 基于中科芯車規(guī)MCU的LED矩陣大燈應(yīng)用方案
- 蘋果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- Littelfuse第2期 | 符合AEC-Q200 車規(guī)的保險(xiǎn)絲/熔斷器
- 有獎(jiǎng)直播報(bào)名:大聯(lián)大世平集團(tuán)&恩智浦 | AI 無所不在,單板電腦也可以
- 助力電賽,搶樓有禮啦~~
- 有獎(jiǎng)?wù)骷和扑]你用過或了解的好用的電源芯片
- 今日競拍:TI SimpleLink Wifi CC3220S
- 下載《TI MCU與無線連接技術(shù)研討會(huì)講座實(shí)錄》更多驚喜等著你!
- 了解PI InnoSwitch-CE,答題贏好禮
- 跟帖曬單有禮《MCU工程師煉成記》
- Microchip 有獎(jiǎng)直播|如何構(gòu)建車載充電器
- 有獎(jiǎng)直播 | 恩智浦微處理器產(chǎn)品與應(yīng)用分享 報(bào)名中!
- OPPO首曝核心數(shù)據(jù):ColorOS月活躍用戶超3億
- 現(xiàn)代宣布開發(fā)出新型發(fā)動(dòng)機(jī)技術(shù) 可提高燃油效率并減少排放
- 汽車上這項(xiàng)安全配置看似黑科技,其實(shí)就是個(gè)坑錢的貨
- 國內(nèi)生產(chǎn)的硅負(fù)極導(dǎo)電劑,可提高電池能量密度到300Wh/kg
- 國產(chǎn)電動(dòng)汽車紛紛官宣突破600公里,技術(shù)真的“彎道超車
- stm32---CAN通信
- stm32---SPI與外部FLASH
- stm32---SPI與內(nèi)部flash
- stm32---ADXL345
- 單片機(jī)引腳模式配置
- 求助各位大俠看看這是什么單片機(jī)
- MSP430F5438學(xué)習(xí)筆記 初始化XT1
- 學(xué)習(xí)LINUX需要哪些基礎(chǔ)?
- 下載中心常見問題解答
- 同一個(gè)函數(shù)調(diào)用5次為何不行?請(qǐng)教
- 電子血壓計(jì)的氣泵氣閥電路部分
- 【有獎(jiǎng)下載活動(dòng)】ADI有獎(jiǎng)下載活動(dòng)之24:ADI公司醫(yī)療X射線成像解決方案
- 請(qǐng)教老師們:自已寫的winCE驅(qū)動(dòng)程序被加載后,馬上又被卸載了?
- TI M4(Cortex M4) MCU DMA 操作
- 鴻業(yè)同行科技有限公司招聘員工?。。?!