久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > stm32串口編程實(shi)例-實(shi)現數據的收發功能

stm32串口編程實例-實現數(shu)據的(de)收發功(gong)能 時間:2018-07-23      ;來源:未知(zhi)

串口(kou)是(shi)USART(通(tong)用同步(bu)/異(yi)步(bu)收(shou)發器)的俗稱。實際上(shang),串行總(zong)線(xian)并不只(zhi)有USART,還包含IIC、SPI、CAN、K線(xian)、單總(zong)線(xian)、USB、485等等總(zong)線(xian),只(zhi)是(shi)因(yin)為UART用得較多,習慣上(shang)叫(jiao)做“串口(kou)”。

首先(xian)來(lai)看下(xia)UART的通信模型,

串口編程

設備(bei)(bei)1與(yu)設備(bei)(bei)2進(jin)行(xing)通信

TXD:發送(song)端,負責發送(song)數(shu)據

RXD:接(jie)收端,負責接(jie)收數據(ju)

GND:地(di)線,保證(zheng)設(she)備(bei)1與設(she)備(bei)2有相同的參考電壓,保證(zheng)通(tong)信的正(zheng)常進(jin)行。

從(cong)模型上我們可以看出UART(USART是(shi)同步(bu)通(tong)信,在這個模型的(de)基礎上都(dou)一條始終控(kong)制(zhi)總(zong)線,但不常用)是(shi)一個異(yi)步(bu)、全雙工(gong)、串行通(tong)信。既然(ran)是(shi)異(yi)步(bu)的(de),那么就需要控(kong)制(zhi)設(she)備1與設(she)備2數據收發的(de)速(su)度一致性,也(ye)就是(shi)兩設(she)備要有相同的(de)波(bo)特率(bit/s一秒鐘能(neng)傳(chuan)的(de)),否則(ze)通(tong)信會出現數據傳(chuan)輸錯(cuo)誤。

現(xian)在我們配置(zhi)stm32的串口1,實現(xian)與(yu)PC端上的串口助手實現(xian)通信。首(shou)先查看串口的引(yin)腳(jiao)、查看芯片手冊(ce)上各引(yin)腳(jiao)對用的復用功能(neng)等。

以下(xia)是(shi)實現代碼,主(zhu)要是(shi)實現Uart1數據的收發。

void USART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

//配置時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* USART1 GPIO config */

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 /* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 mode config */

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

//使(shi)能(neng)串口(kou)中斷

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

//清(qing)空發送完成標志位

USART_ClearFlag(USART1,USART_FLAG_TC);

//使能串口

USART_Cmd(USART1, ENABLE);

}

//定義(yi)printf函數接口(printf重(zhong)定向)

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

return (ch);

}

//定(ding)義scanf函數接口(scanf重定(ding)向(xiang))

int fgetc(FILE *f)

{

while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

return (int)USART_ReceiveData(USART1);

}

//發送字符

char usart1_putc(char ch)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);

return (ch);

}

//發送字符串

int usart1_putstr(unsigned char* buff,int len)

{

int i = 0;

for(i = 0;i < len;i++)

{

usart1_putc(buff[i]);

}

return len;

}

//接收(shou)字符(fu)

char usart1_getc(void)

{

char temp = 0;

 while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!= SET);

temp = USART_ReceiveData(USART1);

return temp;

}

//接收(shou)字符串

int usart1_getstr(unsigned char* buff,int len)

{

int i = 0;

for(i = 0;i < len;i++)

{

buff[i] = usart1_getc();

}

return len;

}

配(pei)置(zhi)好(hao)之(zhi)后,將這些函數放到頭文(wen)件中申明(ming),并放到主函數中去(qu)初始(shi)化及調用,就可以實現數據(ju)的收(shou)發功能。

上一篇:套接字是什么?他的定義如此簡單

下一篇:Linux編譯內核介紹

熱(re)點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點(dian)新聞(wen)推薦
前臺專線:010-82525158 企業培訓洽談專(zhuan)線:010-82525379 院(yuan)校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部