国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

阿里建站系統(tǒng)軟件開發(fā)培訓(xùn)機(jī)構(gòu)去哪個(gè)學(xué)校

阿里建站系統(tǒng),軟件開發(fā)培訓(xùn)機(jī)構(gòu)去哪個(gè)學(xué)校,做中學(xué)網(wǎng)站,常州seo收費(fèi)文章目錄 通信接口串口通信硬件電路電平標(biāo)準(zhǔn)參數(shù)時(shí)序 USART主要特性框圖 數(shù)據(jù)幀發(fā)送器 波特率發(fā)生器SWART串口發(fā)送與接收工程串口收發(fā)數(shù)據(jù)包 通信接口 通信接口是指連接中央處理器(CPU)和標(biāo)準(zhǔn)通信子系統(tǒng)之間的接口,用于實(shí)現(xiàn)數(shù)據(jù)和控制信息在不…

文章目錄

  • 通信接口
  • 串口通信
    • 硬件電路
    • 電平標(biāo)準(zhǔn)
    • 參數(shù)
    • 時(shí)序
  • USART
    • 主要特性
    • 框圖
  • 數(shù)據(jù)幀
    • 發(fā)送器
  • 波特率發(fā)生器
  • SWART串口發(fā)送與接收工程
  • 串口收發(fā)數(shù)據(jù)包

通信接口

通信接口是指連接中央處理器(CPU)和標(biāo)準(zhǔn)通信子系統(tǒng)之間的接口,用于實(shí)現(xiàn)數(shù)據(jù)和控制信息在不同設(shè)備之間的傳輸和交換。通信接口可以是硬件或軟件實(shí)現(xiàn),其目的是使不同設(shè)備之間能夠進(jìn)行有效地通信。

在這里插入圖片描述
上圖是常見的通用通信類型。

雙工指的是接口能夠?qū)崿F(xiàn)雙向數(shù)據(jù)傳輸,即可以同時(shí)進(jìn)行發(fā)送和接收數(shù)據(jù)的功能。

半雙工:數(shù)據(jù)在同一個(gè)通信信道上交替地進(jìn)行雙向傳輸,但不能同時(shí)進(jìn)行發(fā)送和接收。發(fā)送方和接收方需要在不同時(shí)間段進(jìn)行數(shù)據(jù)傳輸。

全雙工:數(shù)據(jù)可以同時(shí)進(jìn)行雙向數(shù)據(jù)傳輸,發(fā)送方和接收方可以在同一時(shí)間段進(jìn)行數(shù)據(jù)發(fā)送和接收。通信雙方可以獨(dú)立地進(jìn)行發(fā)送和接收工作。

時(shí)鐘是指在傳輸數(shù)據(jù)是否能達(dá)到同步傳輸。

同步傳輸:發(fā)送方和接收方之間使用一個(gè)共同的時(shí)鐘信號(hào)來同步數(shù)據(jù)的傳輸。發(fā)送方根據(jù)時(shí)鐘信號(hào)將數(shù)據(jù)按照固定的速率發(fā)送,接收方也按照相同的時(shí)鐘信號(hào)來接收數(shù)據(jù)。
異步傳輸:數(shù)據(jù)的傳輸不依賴于共同的時(shí)鐘信號(hào),而是使用起始位、停止位和數(shù)據(jù)位之間的固定時(shí)間間隔進(jìn)行同步。發(fā)送方會(huì)在發(fā)送數(shù)據(jù)之前先發(fā)送一個(gè)起始位作為同步信號(hào),接收方通過檢測起始位來確定數(shù)據(jù)的開始和結(jié)束。

電平是指傳輸信號(hào)時(shí)的電壓信號(hào)形式。

單端傳輸:信號(hào)傳輸使用單個(gè)導(dǎo)線進(jìn)行,信號(hào)的電壓相對(duì)于某個(gè)參考電平變化來表示。這意味著信號(hào)只有一個(gè)極性,數(shù)據(jù)通過高低電平表示。在單端傳輸中,由于信號(hào)線未與其他導(dǎo)線耦合,容易受到電磁干擾的影響,可能導(dǎo)致信號(hào)質(zhì)量的下降。
差分傳輸:信號(hào)的傳輸使用兩個(gè)導(dǎo)線進(jìn)行,信號(hào)通過兩個(gè)相互補(bǔ)充的電壓信號(hào)的差異來表示。差分傳輸具有很強(qiáng)的抗干擾能力,可以減少電磁干擾對(duì)信號(hào)的影響。

串口通信

串口是一種應(yīng)用十分廣泛的通訊接口,串口成本低、容易使用、通信線路簡單,可實(shí)現(xiàn)兩個(gè)設(shè)備的互相通信;適用于近距離的通信。
在這里插入圖片描述

單片機(jī)的串口可以使單片機(jī)與單片機(jī)、單片機(jī)與電腦、單片機(jī)與各式各樣的模塊互相通信,極大地?cái)U(kuò)展了單片機(jī)的應(yīng)用范圍,增強(qiáng)了單片機(jī)系統(tǒng)的硬件實(shí)力。

硬件電路

在這里插入圖片描述

簡單雙向串口通信有兩根通信線(發(fā)送端TX和接收端RX)
TX與RX要交叉連接
當(dāng)只需單向的數(shù)據(jù)傳輸時(shí),可以只接一根通信線
當(dāng)電平標(biāo)準(zhǔn)不一致時(shí),需要加電平轉(zhuǎn)換芯片

電平標(biāo)準(zhǔn)

電平標(biāo)準(zhǔn)是數(shù)據(jù)1和數(shù)據(jù)0的表達(dá)方式,是傳輸線纜中人為規(guī)定的電壓與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,串口常用的電平標(biāo)準(zhǔn)有如下三種:
TTL電平:+3.3V或+5V表示1,0V表示0
RS232電平:-3~ -15V表示1,+3~ +15V表示0
RS485電平:兩線壓差+2~+6V表示1,-2 ~-6V表示0(差分信號(hào))

參數(shù)

波特率:串口通信的速率,可以指定每秒傳輸?shù)奈粩?shù)

起始位:標(biāo)志一個(gè)數(shù)據(jù)幀的開始,固定為低電平

數(shù)據(jù)位:數(shù)據(jù)幀的有效載荷,1為高電平,0為低電平,低位先行

校驗(yàn)位:用于數(shù)據(jù)驗(yàn)證,根據(jù)數(shù)據(jù)位計(jì)算得來

常用奇偶校驗(yàn)位:通過在數(shù)據(jù)中添加一個(gè)附加位(校驗(yàn)位),以確保接收端可以檢測到傳輸過程中的錯(cuò)誤。
奇校驗(yàn):如果數(shù)據(jù)位中1的個(gè)數(shù)為偶數(shù),則校驗(yàn)位設(shè)置為1,使得數(shù)據(jù)位和校驗(yàn)位中的1的總和保持奇數(shù)。如果數(shù)據(jù)位中1的個(gè)數(shù)為奇數(shù),那么校驗(yàn)位置0。
偶校驗(yàn):如果數(shù)據(jù)位中1的個(gè)數(shù)為偶數(shù),則校驗(yàn)位置0,使得數(shù)據(jù)位和校驗(yàn)位的總個(gè)數(shù)為偶數(shù)。如果數(shù)據(jù)位中1的個(gè)數(shù)為奇數(shù),校驗(yàn)位置1 。

停止位:用于數(shù)據(jù)幀間隔,固定為高電平

在這里插入圖片描述

時(shí)序

在這里插入圖片描述
輸入不同的數(shù)據(jù),顯示不同的時(shí)序。

USART

通用同步異步收發(fā)器(USART)提供了一種靈活的方法與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。 USART利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇。

主要特性

1.全雙工的,異步通信
2.分?jǐn)?shù)波特率發(fā)生器系統(tǒng)
─ 發(fā)送和接收共用的可編程波特率,最高達(dá)4.5Mbits/s
3.可編程數(shù)據(jù)字長度(8位或9位)
4.可配置的停止位-支持1或2個(gè)停止位
5.校驗(yàn)控制
─ 發(fā)送校驗(yàn)位
─ 對(duì)接收數(shù)據(jù)進(jìn)行校驗(yàn)
6.支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

框圖

在這里插入圖片描述
先看左上角的接口處,TX與RX就是發(fā)送和接收的引腳,下面的三個(gè)接口是智能卡和IrDA通信的引腳。
發(fā)送腳就是通過發(fā)送移位寄存器送出去的,接收腳就是將接收數(shù)據(jù)送到接收移位寄存器的。

灰色部分就是串口的數(shù)據(jù)寄存器。有兩個(gè)數(shù)據(jù)寄存器,一個(gè)用來發(fā)送數(shù)據(jù),一個(gè)用來接收數(shù)據(jù);在程序上,只表現(xiàn)為一個(gè)寄存器,它們寄存器共用地址進(jìn)行存儲(chǔ)。
當(dāng)你進(jìn)行寫入操作時(shí),數(shù)據(jù)就寫到TDR,當(dāng)你進(jìn)行讀取操作時(shí),數(shù)據(jù)就從RDR進(jìn)行讀出。
下面是移位寄存器,作用是把一個(gè)字節(jié)的數(shù)據(jù)一位一位進(jìn)行位移。

假設(shè)你在某時(shí)刻給TDR寫入數(shù)據(jù)0x66,在二進(jìn)制存儲(chǔ)就是01100110,此時(shí)硬件會(huì)檢測到你寫入的數(shù)據(jù),就會(huì)檢查移位寄存器是否有數(shù)據(jù)正在移位,如果沒有01100110就會(huì)立刻放入移位寄存器中,此時(shí)也會(huì)置出一個(gè)標(biāo)志位TXE,發(fā)送寄存器為空;有了這個(gè)標(biāo)志我們就可以在TDR再寫入一個(gè)數(shù)據(jù)了。移位寄存器在發(fā)送器控制的情況下,將數(shù)據(jù)一位一位進(jìn)行傳輸?shù)絋X引腳進(jìn)行輸出(低位先出),當(dāng)數(shù)據(jù)全部移位后,新的數(shù)據(jù)就會(huì)再次從TDR轉(zhuǎn)移到移位寄存器中來,如果移位寄存器還沒有完成,那么TDR會(huì)等移位寄存器完成移位之后才將數(shù)據(jù)轉(zhuǎn)移。有了TDR和移位寄存器雙重緩存,可以保證數(shù)據(jù)發(fā)送時(shí),數(shù)據(jù)幀之間沒有空閑。
而接收部分也是同樣的道理,接收移位寄存器由接收器控制,低位先放到移位寄存器的高位,隨著數(shù)據(jù)的增加而右移,當(dāng)移位寄存器數(shù)據(jù)達(dá)到一個(gè)字節(jié)后,傳輸給接收寄存器RDR,此時(shí)也會(huì)有一個(gè)標(biāo)志位RXNE置1,意味著接收寄存器有數(shù)據(jù)了,我們可以對(duì)DR寄存器的數(shù)據(jù)進(jìn)行讀走。

接著看到下面,有一個(gè)硬件數(shù)據(jù)流控,如果發(fā)送設(shè)備發(fā)送太快,接收設(shè)備來不及處理,可以通過流控來控制傳輸?shù)乃俣取?br /> 它有兩個(gè)引腳,一個(gè)是nRTS,另一個(gè)是nCTS。
nRTS是請(qǐng)求發(fā)送,是輸出腳,就是告訴別人,我當(dāng)前能不能接收;
nCTS是清除發(fā)送,是輸入腳,用于接收別人nRTS的信號(hào);

接著看右邊的SCLK,這是一個(gè)產(chǎn)生同步的時(shí)鐘信號(hào),它是配合發(fā)送移位寄存器輸出的,發(fā)送移位寄存器每發(fā)送一次,同步時(shí)鐘電平就跳變一個(gè)周期,時(shí)鐘會(huì)告訴對(duì)方我已經(jīng)移出去一個(gè)數(shù)據(jù)了,你看要不要讓我這個(gè)時(shí)鐘信號(hào)來指導(dǎo)你接收一下?當(dāng)然這個(gè)時(shí)鐘只支持輸出,不支持輸入,所以兩個(gè)SWART不能實(shí)現(xiàn)同步的串口通信。
主要用途是兼容別的協(xié)議或者做自適應(yīng)波特率。

接著看到中間的喚醒單元,這部分的作用是實(shí)現(xiàn)串口掛載多個(gè)設(shè)備。
中斷控制,支持對(duì)標(biāo)志位標(biāo)志的地方進(jìn)行中斷。

最下面的波特率發(fā)生器部分,其實(shí)就是分頻器,對(duì)APB時(shí)鐘進(jìn)行分頻,得到發(fā)送和接收移位的時(shí)鐘。

數(shù)據(jù)幀

字長可以通過編程USART_CR1寄存器中的M位,選擇成8或9位(見圖249)。在起始位期間, TX腳處于低電平,在停止位期間處于高電平。
在這里插入圖片描述

發(fā)送器

發(fā)送器根據(jù)M位的狀態(tài)發(fā)送8位或9位的數(shù)據(jù)字。當(dāng)發(fā)送使能位(TE)被設(shè)置時(shí),發(fā)送移位寄存器中的數(shù)據(jù)在TX腳上輸出,相應(yīng)的時(shí)鐘脈沖在CK腳上輸出。
USART支持多種停止位的配置: 0.5、 1、 1.5和2個(gè)停止位。
在這里插入圖片描述

波特率發(fā)生器

發(fā)送器和接收器的波特率由波特率寄存器BRR里的DIV確定
計(jì)算公式:波特率 = fPCLK2/1 / (16 * DIV)
在這里插入圖片描述
假設(shè)我們要輸出波特率為9600,那么通過計(jì)算DIV=72M/16/9600=468.75
所以置于波特率寄存器中的值為468.75.

SWART串口發(fā)送與接收工程

OLED代碼鏈接入口

接線方式:
在這里插入圖片描述
發(fā)送時(shí)需要一個(gè)串口助手在電腦來顯示內(nèi)容,我們將實(shí)現(xiàn)STM32與電腦之間的數(shù)據(jù)傳輸。以STM32為主機(jī)。

Serial.h

#ifndef __SERIAL_H__
#define __SERIAL_H__#include <stdio.h>void Serial_Init();
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t* Arr,uint8_t Lenth);
void Serial_SendString(char* String);
void Serial_SendNumber(uint32_t Number,uint8_t Lenth);
uint8_t Serial_GetRxFlag();
uint8_t Serial_GetRxData();#endif 

Serial.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>uint8_t Serial_RxData;
uint8_t Serial_RxFlag;void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉輸入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600; //配置波特率USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //配置硬件流控模式USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //串口模式USART_InitStructure.USART_Parity=USART_Parity_No; //配置奇偶效驗(yàn)位USART_InitStructure.USART_StopBits=USART_StopBits_1; //指定停止位數(shù)USART_InitStructure.USART_WordLength=USART_WordLength_8b; //指定數(shù)據(jù)幀位數(shù)USART_Init(USART1,&USART_InitStructure);//配置usart開啟中斷USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中斷源RXNENVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1,ENABLE);
}//發(fā)送字節(jié)
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}//發(fā)送數(shù)組
void Serial_SendArray(uint8_t* Arr,uint8_t Lenth)
{uint8_t i;for(i=0;i<Lenth;i++){Serial_SendByte(Arr[i]);}
}//發(fā)送字符串
void Serial_SendString(char* String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}
}uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result=1;while(Y--){Result*=X;}return Result;
}void Serial_SendNumber(uint32_t Number,uint8_t Lenth)
{uint8_t i;for(i=0;i<Lenth;i++){Serial_SendByte(Number/Serial_Pow(10,Lenth-1-i)%10+'0');}
}//獲取接收狀態(tài)
uint8_t Serial_GetRxFlag()
{if(Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;}
//獲取接收數(shù)據(jù)
uint8_t Serial_GetRxData()
{return Serial_RxData;
}void USART1_IRQHandler()
{if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){Serial_RxData=USART_ReceiveData(USART1);Serial_RxFlag=1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}
}

初始化輸出需要配置復(fù)用功能,因?yàn)镾WART為片上外設(shè)。
發(fā)送字節(jié)需要用TXE標(biāo)志位來表示已經(jīng)從DR寄存器發(fā)送到移位寄存器中。所以用到while來進(jìn)行等待;
接收時(shí),利用RNXE產(chǎn)生的標(biāo)志位來產(chǎn)生中斷,在中斷函數(shù)中獲取DR寄存器的數(shù)據(jù)。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "Serial.h"
#include "OLED.h"
int main()
{uint8_t Rxdata;OLED_Init();Serial_Init();OLED_ShowString(1,1,"RxData:");while(1){if(Serial_GetRxFlag()==1){Rxdata=Serial_GetRxData();Serial_SendByte(Rxdata);OLED_ShowHexNum(1,8,Rxdata,2);}}}

串口收發(fā)數(shù)據(jù)包

連接方式:
在這里插入圖片描述

利用連續(xù)的數(shù)據(jù)序列來對(duì)LED燈的亮滅進(jìn)行控制;

Serial.h

#ifndef __SERIAL_H__
#define __SERIAL_H__#include <stdio.h>
#include <string.h>extern uint8_t Serial_RxFlag;
extern char Serial_RxPacket[];void Serial_Init();
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t* Arr,uint8_t Lenth);
void Serial_SendString(char* String);
void Serial_SendNumber(uint32_t Number,uint8_t Lenth);
void Serial_Printf(char* format,...);#endif 

Serial.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>char Serial_RxPacket[100];
uint8_t Serial_RxFlag;void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉輸入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600; //配置波特率USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //配置硬件流控模式USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //串口模式USART_InitStructure.USART_Parity=USART_Parity_No; //配置奇偶效驗(yàn)位USART_InitStructure.USART_StopBits=USART_StopBits_1; //指定停止位數(shù)USART_InitStructure.USART_WordLength=USART_WordLength_8b; //指定數(shù)據(jù)幀位數(shù)USART_Init(USART1,&USART_InitStructure);//配置usart開啟中斷USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中斷源RXNENVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1,ENABLE);
}//發(fā)送字節(jié)
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}//發(fā)送數(shù)組
void Serial_SendArray(uint8_t* Arr,uint8_t Lenth)
{uint8_t i;for(i=0;i<Lenth;i++){Serial_SendByte(Arr[i]);}
}//發(fā)送字符串
void Serial_SendString(char* String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}
}uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result=1;while(Y--){Result*=X;}return Result;
}
//發(fā)送數(shù)字
void Serial_SendNumber(uint32_t Number,uint8_t Lenth)
{uint8_t i;for(i=0;i<Lenth;i++){Serial_SendByte(Number/Serial_Pow(10,Lenth-1-i)%10+'0');}
}void Serial_Printf(char* format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);
}//串口接收中斷(接收一位數(shù)據(jù)中斷一次),接收數(shù)據(jù)包
void USART1_IRQHandler()
{static uint8_t RxState=0; //獲取當(dāng)前狀態(tài)static uint8_t pRxPacket=0; //數(shù)據(jù)包有效位下標(biāo)if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){uint8_t RxData=USART_ReceiveData(USART1);if(RxState==0){if(RxData=='&'&& Serial_RxFlag==0){RxState=1;pRxPacket=0;}}else if(RxState==1){            if(RxData=='\r'){RxState=2;}else{Serial_RxPacket[pRxPacket++]=RxData;}}else if(RxState==2){if(RxData=='\n'){RxState=0;Serial_RxPacket[pRxPacket]='\0';Serial_RxFlag=1;}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}
}

對(duì)于接收的數(shù)據(jù)包,利用了一種狀態(tài)機(jī)的方式進(jìn)行接收
在這里插入圖片描述
通過包頭和包尾對(duì)數(shù)據(jù)有效位進(jìn)行保護(hù),可以讓一連串重復(fù)的數(shù)據(jù)可以找到數(shù)據(jù)位,避免找不到數(shù)據(jù)位的頭的情況。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Serial.h"
#include "OLED.h"
int main()
{OLED_Init();Serial_Init();LED_Init();OLED_ShowString(1, 1, "RxPacket:");while(1){if(Serial_RxFlag==1){if(strcmp(Serial_RxPacket,"LED_ON")==0){LED1_ON();OLED_ShowString(2,1,"LED_ON_OK   ");Serial_SendString("LED_ON_OK");}else if(strcmp(Serial_RxPacket,"LED_OFF")==0){LED1_OFF();OLED_ShowString(2,1,"LED_OFF_OK   ");Serial_SendString("LED_OFF_OK");}else{OLED_ShowString(2,1,"ERROR_COMMAND");Serial_SendString("ERROR_COMMAND");}Serial_RxFlag=0;}}}

LED.c

#include "stm32f10x.h"                  // Device headervoid LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}void LED1_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);
}void LED2_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);}
}

LED.h

#ifndef __LED_H__
#define __LED_H__void LED_Init();
void LED1_ON();
void LED1_OFF();
void LED1_Turn();
void LED2_ON();
void LED2_OFF();
void LED2_Turn();#endif
http://m.aloenet.com.cn/news/32891.html

相關(guān)文章:

  • 受歡迎的天津網(wǎng)站建設(shè)百度網(wǎng)盤搜索引擎入口
  • 做長海報(bào)的網(wǎng)站外包推廣服務(wù)
  • 煙臺(tái)網(wǎng)站建設(shè)搜狗推廣登錄入口
  • 怎么建設(shè)一個(gè)網(wǎng)站賺錢seo排名查詢工具
  • 網(wǎng)站可以微信支付是怎么做的百度熱詞
  • 公司網(wǎng)站的seo優(yōu)化怎么做百度網(wǎng)盤人工客服電話多少
  • 不會(huì)網(wǎng)站維護(hù)可以做嗎怎么開通百度推廣賬號(hào)
  • 北京上海網(wǎng)站建設(shè)公司品牌宣傳推廣文案
  • 網(wǎng)站優(yōu)化的策略鎮(zhèn)江網(wǎng)站建設(shè)企業(yè)
  • 北京電腦培訓(xùn)網(wǎng)站軟文廣告示范
  • 上傳網(wǎng)站到二級(jí)域名財(cái)經(jīng)新聞最新消息
  • 昆明網(wǎng)上商城網(wǎng)站建設(shè)市場營銷策略
  • 寵物網(wǎng)站開發(fā)與實(shí)現(xiàn)軟文推廣做得比較好的推廣平臺(tái)
  • 做集團(tuán)網(wǎng)站應(yīng)注意什么谷歌seo優(yōu)化技巧
  • 做家居商城網(wǎng)站鄭州seo推廣
  • 怎么把網(wǎng)站放到空間嗎教育培訓(xùn)機(jī)構(gòu)平臺(tái)
  • 公眾號(hào)的微網(wǎng)站開發(fā)營銷型網(wǎng)站建設(shè)排名
  • 南京代做網(wǎng)站濟(jì)南百度競價(jià)代運(yùn)營
  • c 做網(wǎng)站如何調(diào)用dll免費(fèi)源碼網(wǎng)站
  • 公司怎么建立自己網(wǎng)站百度推廣價(jià)格價(jià)目表
  • php app網(wǎng)站建設(shè)武漢seo管理
  • 藍(lán)色大氣網(wǎng)站欣賞視頻推廣平臺(tái)
  • 手機(jī)企業(yè)網(wǎng)站制作企業(yè)網(wǎng)頁設(shè)計(jì)公司
  • 網(wǎng)站建設(shè)夢(mèng)幻創(chuàng)意百度文庫官網(wǎng)
  • php做的網(wǎng)站安全嗎今天的新聞?lì)^條
  • 什么公司在百度做網(wǎng)站常州seo關(guān)鍵詞排名
  • 做網(wǎng)站實(shí)習(xí)日志寧波seo怎么做引流推廣
  • 陽泉購物網(wǎng)站開發(fā)設(shè)計(jì)市場營銷策劃
  • 網(wǎng)站網(wǎng)絡(luò)廣告如何建設(shè)自助建站免費(fèi)搭建個(gè)人網(wǎng)站
  • 織夢(mèng)網(wǎng)站后臺(tái)關(guān)鍵詞推廣優(yōu)化app