-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 營銷推廣 > 專題列表 > 正文
串口和can通訊區(qū)別(串口和can通訊區(qū)別在哪)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于串口和can通訊區(qū)別的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁版、PC客戶端和批量生成器
問友Ai官網(wǎng):https://ai.de1919.com。
本文目錄:
can總線, i2c, isp,串口通信,這些通信相比較都有什么優(yōu)缺點?
最大區(qū)別:CAN-bus、串行通訊用于設(shè)備之間的通訊,IIC、SPI用于元件之間的通訊。stm32can通信和串口的區(qū)別
一、簡介STM32F103ZET6有3個USART(通用同步和異步收發(fā)器) + 2個UART(通用異步收發(fā)器)
分別是USART1,USART2,USART3
和UART4,UART5
二、USART和UART有什么區(qū)別呢?
當(dāng)進(jìn)行異步通信時,這兩者是沒有區(qū)別的。區(qū)別在于USART比UART多了同步通信功能,同步通信需要STM32提供時鐘來同步的,
這個同步通信功能可以把USART當(dāng)做SPI來用,比如用USART來驅(qū)動SPI設(shè)備。同步通信的連接示例圖:
其中RX,TX,SCLK引腳的定義,在數(shù)據(jù)手冊上都可以找到:百為stm32開發(fā)板光盤芯片數(shù)據(jù)手冊數(shù)據(jù)手冊STM32F103xC STM32F103xD STM32F103xE.pdf
這個區(qū)別在初學(xué)STM32的時候我們不需要去深入研究,只要知道USART有很多功能,除了全雙工異步通信之外,還包括支持同步通信和單線半雙工通信,支持LIN(局部互連網(wǎng)),智能卡協(xié)議和IrDA紅外通信,以及調(diào)制解調(diào)器(CTS/RTS)等操作。
三、數(shù)據(jù)通信格式
我們用得最多的是全雙工異步通信功能,下面我們來研究下怎么通過串口1(USART1)來收發(fā)信息,和printf功能的實現(xiàn)。
通常串口通信的數(shù)據(jù)格式如下圖:
我們需要設(shè)置的數(shù)據(jù)有通信速率,數(shù)據(jù)字長,奇偶檢驗位,停止位。一個典型的設(shè)置是115200波特率,8位數(shù)據(jù),無奇偶校驗,1位停止位。
這個設(shè)置在固件函數(shù)庫里面,我們是通過設(shè)置USART_InitStructure結(jié)構(gòu)體,然后調(diào)用USART_Init函數(shù)來實現(xiàn)的:
USART_InitStructure.USART_BaudRate = 115200; //設(shè)置通信波特率為115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //設(shè)置通信數(shù)據(jù)格式為8位數(shù)據(jù)
USART_InitStructure.USART_StopBits = USART_StopBits_1; //設(shè)置停止位為1位
USART_InitStructure.USART_Parity = USART_Parity_No ; //設(shè)置為無奇偶校驗
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //設(shè)置為無硬件流控制,即無CTS/RTS控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //設(shè)置發(fā)送使能,接收使能
USART_Init(USART1, &USART_InitStructure); //調(diào)用USART_Init,把上面的參數(shù)分別設(shè)置進(jìn)USART的控制寄存器USART1->CR1,USART1->CR2,USART1->CR3
USART_Cmd(USART1, ENABLE); //使能串口
大家發(fā)現(xiàn),在2.0固件庫的USART例程里并沒有看到USART1,因為是它用USARTx宏代替的,
其中USARTx是platform_config.h里定義的,大概是這個樣子:
#ifdef USE_USART1
#define USARTx USART1
#define GPIOx GPIOA
#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA
#define GPIO_RxPin GPIO_Pin_10
#define GPIO_TxPin GPIO_Pin_9
#endif
只有定義了USE_USART1,上面的#ifdef USE_USART1和#endif之間的內(nèi)容才會被編譯,所以在platform_config.h里也需要定義USE_USART1:
#define USE_USART1
這里GPIO_Pin_9是串口1的發(fā)送引腳,GPIO_Pin_10是串口1的接收引腳,也可以從百為STM32開發(fā)板的電路圖上看出來:
四、串口引腳配置
上面USART_Init函數(shù)配置了USART1的數(shù)據(jù)通信格式,但串口能工作的前提是需要配置相應(yīng)的TX,RX的引腳,這個是通過GPIO_Configuration函數(shù)來配置的:
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打開USART1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打開AFIO時鐘
/* 配置 USARTx_Tx 為復(fù)用推挽輸出 */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOx, &GPIO_InitStructure);
/* 配置 USARTx_Rx 為輸入懸空 */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
五、收發(fā)數(shù)據(jù)
配置好USART1使用的引腳,數(shù)據(jù)通信格式,下面就可以收發(fā)數(shù)據(jù)了,
USART_GetFlagStatus函數(shù)可以讀取收發(fā)狀態(tài)等,讀取狀態(tài)標(biāo)志可以是以下幾個:
發(fā)送數(shù)據(jù)示例:
USART_SendData(USART1, 'a'); //發(fā)送一個字符a
接收數(shù)據(jù)示例:
u16 RxData;
RxData = USART_ReceiveData(USART1); //從USART1接收數(shù)據(jù)到RxData變量
下面是串口通信printf程序里的主要功能,上電打印一串信息,把接收到的數(shù)據(jù)回顯到PC上:
/* 用printf打印一串信息到PC的超級終端或串口調(diào)試軟件上 */
printf("nrUSART Printf Example: retarget the C library printf function to the USARTnr");
while (1)
{
if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判斷是否有數(shù)據(jù)要接收
{
i = USART_ReceiveData(USARTx); //接收數(shù)據(jù)
printf("%cnr",i&0xff); //回顯到PC的超級終端或串口調(diào)試軟件上
}
}
六、printf的實現(xiàn)
上面的printf是怎么實現(xiàn)的呢,這個是C標(biāo)準(zhǔn)庫里定義的函數(shù),我們是怎樣把它的輸出重定向到串口的呢?
我們知道printf是調(diào)用fputc函數(shù)來打印的,所以我們只要把fputc函數(shù)重定義就可以了:
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
PUTCHAR_PROTOTYPE
{
/* 調(diào)用USARTx發(fā)送一個字符*/
USART_SendData(USARTx, (u8) ch);
/* 等待發(fā)送完成 */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
{
}
return ch;
}
另外還要加上頭文件
#include "stdio.h"
還要注意的是,在工程里要勾上USE MicroLIB
以上就是關(guān)于串口和can通訊區(qū)別相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
can與串口的區(qū)別(can與串口的區(qū)別是什么)
農(nóng)村二樓衛(wèi)生間排水設(shè)計(農(nóng)村二樓衛(wèi)生間排水設(shè)計規(guī)范)