日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年09月20日(星期五)

正在發(fā)生

2019年09月20日 | 第41章 RS-485通訊實(shí)驗(yàn)—零死角玩轉(zhuǎn)STM32-F429系列

發(fā)布者:平凡夢(mèng)想 來源: eefocus關(guān)鍵字:RS-485  通訊實(shí)驗(yàn)  STM32-F429系列 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

本章參考資料:《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ì)比

image.png

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ū)。

[1] [2]
關(guān)鍵字:RS-485  通訊實(shí)驗(yàn)  STM32-F429系列 引用地址:第41章 RS-485通訊實(shí)驗(yàn)—零死角玩轉(zhuǎn)STM32-F429系列

上一篇:第42章 電源管理—實(shí)現(xiàn)低功耗—零死角玩轉(zhuǎn)STM32-F429系列
下一篇:第25章 串行FLASH文件系統(tǒng)FatFs—零死角玩轉(zhuǎn)STM32-F429系列

推薦閱讀

近場(chǎng)通信(NFC)是一種讓兩個(gè)設(shè)備在幾厘米的距離內(nèi)通信交互、最大數(shù)據(jù)傳輸速率424kb / s 的近距離雙向通信技術(shù),用于在兩個(gè)設(shè)備之間實(shí)現(xiàn)安全、簡單的數(shù)據(jù)交換。作為RFID技術(shù)的一個(gè)分支,NFC有望從手機(jī)擴(kuò)展到汽車應(yīng)用。NFC被視為許多新車載功能的實(shí)現(xiàn)技術(shù),還能簡化現(xiàn)有車載功能的使用和操作。 當(dāng)用戶的手機(jī)與汽車首次連接時(shí),藍(lán)牙配對(duì)需要多次的用戶交...
北京飛漫軟件技術(shù)有限公司宣布:將在 MiniGUI 4.0.2 版本中支持國產(chǎn)操作系統(tǒng) RT-Thread! 這是自 MiniGUI 創(chuàng)始人魏永明在本月初宣布啟動(dòng) HybridOS 開源協(xié)作計(jì)劃以來的第一個(gè)好消息:國產(chǎn)開源基礎(chǔ)軟件終于走上了協(xié)作的道路! 1998 年年底,魏永明開始在清華大學(xué)開發(fā) MiniGUI,1999 年 5 月在水木清華 BBS 上發(fā)布了 MiniGUI 的第一個(gè)版本。...
一名備受尊重的日本分析師Takashi Mochizuki近日發(fā)推,他轉(zhuǎn)發(fā)了樂天證券的報(bào)道,在里面一名叫Nohio Imanaka的分析師預(yù)測(cè)稱,PS5主機(jī)生命周期內(nèi)的銷量可能會(huì)超過2億臺(tái),成為有史以來最成功的家用機(jī)。超過2億臺(tái),這意味著PS5的累計(jì)銷量將超過PS2和任天堂DS,目前這兩個(gè)機(jī)器的銷量都在1.55億臺(tái)左右。這一報(bào)告對(duì)索尼來說將是一個(gè)好消息,因?yàn)樗髂嵩谶@款游戲...
9月20日,據(jù)外媒報(bào)道,市場(chǎng)調(diào)查機(jī)構(gòu)Omdia公布數(shù)據(jù)顯示,三星今年第三季度半導(dǎo)體銷售額占比預(yù)計(jì)達(dá)14.11%,位居世界第一。此次對(duì)半導(dǎo)體企業(yè)銷售額的預(yù)測(cè)調(diào)查不包括各企業(yè)代工廠的銷售業(yè)績。Omdia稱,受第三季度半導(dǎo)體價(jià)格上漲及銷量增加的影響,三星半導(dǎo)體銷售額比重反超英特爾成為榜首,較英特爾(12.09%)高出2個(gè)百分點(diǎn),這是三星自2018年第三季度以來歷經(jīng)...

史海拾趣

問答坊 | AI 解惑

[資料]KeilC51使用詳解V1.0

KeilC51使用詳解V1.0 第一章 Keil C51開發(fā)系統(tǒng)基本知識(shí) 第二章 Keil C51軟件使用詳解 第三章 Keil C51 vs 標(biāo)準(zhǔn)C 第四章 Keil C51高級(jí)編程 第五章 ...…

查看全部問答∨

這些有什么做用呀?

在platform.reg注冊(cè)表中, [HKEY_CURRENT_USER\\......\\USB] \"Entry\"=hex:\\       08,02,40,00,00,00,00,00,00,00,00,00,00,00,0f,00,00,00,00,00,64,ce,e3,03,00,\\       00,00,00,00,00,00,00, ...…

查看全部問答∨

如何定制一個(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 ...…

查看全部問答∨

WinCE 5.0下的中文輸入法不能輸入中文

我用的是PB5.0,輸入法已經(jīng)添加進(jìn)去,并生成了鏡像。 可是輸入法是灰色的,右下角的“中”字和“半”字都是灰色的,打出來的字仍然是英文字母。 比如新建一個(gè)文件夾,重命名的時(shí)候,無法出現(xiàn)中文。 奇怪的是,打開記事本,就可以輸入中文,有朋友 ...…

查看全部問答∨

電池電壓AD采樣不穩(wěn)定

我的是手持機(jī),需要AD 采樣電池電壓,現(xiàn)在發(fā)現(xiàn)我的 AD采樣很不穩(wěn)定,我是連續(xù)采了10次去掉最大最小求平均的~,結(jié)果值還是跳來跳去~~~~怎么回事啊…

查看全部問答∨

word2003操作問題:我想把第8張紙定為第一頁,怎么辦?

word2003操作問題:我想把第8張紙定為第一頁,怎么辦?   頁碼的設(shè)置,求指導(dǎo)?。?!…

查看全部問答∨

用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é)議的 ...…

查看全部問答∨

RAW task 篇

這篇文檔會(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ā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved