STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9 PC10 PC11

STM32F103共有五個串口,有時候在項目中,其他的引腳已經配置用了,重新改太麻煩

STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9  PC10 PC11

所有本次實驗 使用了串口3的映射端口,配置和普通的類似 

只是注意要使用映射使能說明


GPIO_PinRemapConfig(GPIO_FullRemap_USART3  , ENABLE); 

 

 

 

 

 

 

 

 

void USART3_Configuration(u32 bound)
{
  //GPIO端口設置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
 #if 1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1
#endif
	
#if 0
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啓GPIOB和USART3時鐘
	
		//USART3_TX   GPIOB.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10
	
	//USART3_RX	  GPIOB.11初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  
	
#endif	
	

#if 0	//重映射

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1
	
	//GPIO_PartialRemap_USART3 部分重映射  GPIOC_10  GPIOC_11
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);  
	//USART3_TX   GPIOC.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
   
  //USART3_RX	  GPIOC.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始 
#endif


#if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1

 	//GPIO_FullRemap_USART3  完全重映射  D8   D9
 	GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);  
	//USART3_TX   GPIOD8
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
   
  //USART3_RX	  GPIOD9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始 
#endif 
 
 
  //Usart3 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶佔優先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子優先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器
  
   //USART 初始化設置
 
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式
	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(USART3, &USART_InitStructure); //初始化串口3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啓串口接受中斷
  USART_Cmd(USART3, ENABLE);                    //使能串口3 
 
}

 

#include "sys.h"
#include "usart.h"
#include "timer.h" 
#include "stdint.h" 
 u8 	checkdata[8];		//檢測串口1接收的特定數據數據
//發送上位機的數據       
//
uint32_t crc16_data1[] = { 0x00,0x00, 0x00 };//飲水機數據
uint32_t crc16_data2[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data3[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data4[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data5[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data6[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data7[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data8[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data9[] = { 0x00,0x00, 0x00 };//
uint32_t crc16_data10[]= { 0x00,0x00, 0x00 };//


//串口1隊列定義
u8 	UART1SendBuff[UART1BuffSize];		//發送數據
u8 	UART1ReceBuff[UART1BuffSize];		//接收數據?
u16 UART1ReceIn = 0;//接收狀態標記數據位	 
u8  UART1ReceFullFlag = 0;//接收完數據標誌位


//串口3隊列定義
u8 	UART3SendBuff[UART3BuffSize];		//發送數據
u8 	UART3ReceBuff[UART3BuffSize];		//接收數據?
u16 UART3ReceIn = 0;//接收狀態標記數據位	 
u8  UART3ReceFullFlag = 0;//接收完數據標誌位

void USART1_Configuration(u32 bound){
  //GPIO端口設置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA時鐘
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶佔優先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子優先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器
  
   //USART 初始化設置
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式
	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); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啓串口接受中斷
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

void USART3_Configuration(u32 bound)
{
  //GPIO端口設置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
 #if 1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1
#endif
	
#if 0
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啓GPIOB和USART3時鐘
	
		//USART3_TX   GPIOB.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10
	
	//USART3_RX	  GPIOB.11初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  
	
#endif	
	

#if 0	//重映射

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1
	
	//GPIO_PartialRemap_USART3 部分重映射  GPIOC_10  GPIOC_11
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);  
	//USART3_TX   GPIOC.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
   
  //USART3_RX	  GPIOC.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始 
#endif


#if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap時鐘|RCC_APB2Periph_AFIO //開啓GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//這裏要分開打開 //USART3時鐘  來自APB1

 	//GPIO_FullRemap_USART3  完全重映射  D8   D9
 	GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);  
	//USART3_TX   GPIOD8
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
   
  //USART3_RX	  GPIOD9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始 
#endif 
 
 
  //Usart3 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶佔優先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子優先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器
  
   //USART 初始化設置
 
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式
	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(USART3, &USART_InitStructure); //初始化串口3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啓串口接受中斷
  USART_Cmd(USART3, ENABLE);                    //使能串口3 
 
}






//串口1發送一幀數據
void USART1_SendOneData(uint32_t SendOneData)
{
	USART_SendData(USART1, SendOneData);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
	{}
}
//串口2發送一幀數據
void USART2_SendOneData(uint32_t SendOneData)
{
	USART_SendData(USART2, SendOneData);
	while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
	{}
}

//串口3發送一幀數據
void USART3_SendOneData(uint32_t SendOneData)
{
	USART_SendData(USART3, SendOneData);
	while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
	{}
}
//串口1發送一列數據
void USART1_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{
	uint8_t  i;
	for(i=0;i<Length;i++)
	{
		USART1_SendOneData(*Buffer++);
	}
}

//串口2發送一列數據
void USART2_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{
	uint8_t  i;
	for(i=0;i<Length;i++)
	{
		USART2_SendOneData(*Buffer++);
	}
}

//串口3發送一列數據
void USART3_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{
	uint8_t  i;
	for(i=0;i<Length;i++)
	{
		USART3_SendOneData(*Buffer++);
	}
}



//串口1中斷服務函數
void USART1_IRQHandler(void)
{
	u8 Res;//數據暫存
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷
	{
		Res =USART_ReceiveData(USART1);	//讀取接收到的數據		
		switch(UART1ReceIn)//讀取接收到的數據有幾位 每一位對應的數據協議校驗
		{
			case 0:
				if(Res==0xFE)
					UART1ReceBuff[UART1ReceIn++] = Res;
				else
					UART1ReceIn = 0;
				break;
			case 1:
				if(Res==0xFE)
					UART1ReceBuff[UART1ReceIn++] = Res;
				else
					UART1ReceIn = 0;
				break;
			case 2://此處爲判斷數據的位置  正反轉
//				if(Res==0x02)//在其他位置判斷數據
//				{UART1ReceBuff[UART1ReceIn++] = Res;
//					checkdata[0]=UART1ReceBuff[2];}
			{UART1ReceBuff[UART1ReceIn++] = Res;
			checkdata[0]=UART1ReceBuff[2];
			
			}
			break;
			case 3://此處爲判斷數據的位置  旋轉角度
//				if(Res==0x02)//在其他位置判斷數據
//				{UART1ReceBuff[UART1ReceIn++] = Res;
//					checkdata[0]=UART1ReceBuff[2];}
			{UART1ReceBuff[UART1ReceIn++] = Res;
			checkdata[1]=UART1ReceBuff[3];	//接收到的角度數據和實際齒輪數據不一致		
			}	
			break;			
			case 4:
				if(Res==0xFD)
					UART1ReceBuff[UART1ReceIn++] = Res;
				else
					UART1ReceIn = 0;
				break;
			case 5:
				if(Res==0xFD)
					UART1ReceBuff[UART1ReceIn++] = Res;
				else
					UART1ReceIn = 0;
				break;
			default:
				UART1ReceBuff[UART1ReceIn++] = Res;
				break;
		}

		if(UART1ReceIn >= 5)
		{
			UART1ReceFullFlag = 1;	//數據完整接受完 
				UART1ReceIn = 0;
			 timer8flag=0;
		}
//		USART_ClearFlag(USART1, USART_IT_RXNE);//清除相對應的中斷位   清除中斷預處理位USART_ClearITPendingBit左移八位是USART_ClearFlag 
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除相對應的中斷位   清除中斷預處理位USART_ClearITPendingBit左移八位是USART_ClearFlag  
//		 
	}
	 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)	// 發送中斷  USART_GetITStatus
	{
	//	USART_ClearFlag(USART1, USART_IT_TXE);					// clear interrupt  清除中斷預處理位
		USART_ClearITPendingBit(USART1, USART_IT_TXE);					// clear interrupt  清除中斷預處理位
	}	
//	if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
//	{	
//		USART_ClearFlag(USART1, USART_FLAG_ORE);	
//	}

}


//串口3中斷服務函數
void USART3_IRQHandler(void)
{
	u8 Res;//數據暫存
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中斷
	{
		Res =USART_ReceiveData(USART3);	//讀取接收到的數據 USART_ReceiveData
			USART_SendData(USART1,Res);//將讀取到的數據通過串口1發送
		switch(UART3ReceIn)//讀取接收到的數據有幾位 每一位對應的數據協議校驗
		{
			case 0:
				if(Res==0XFE)
					UART3ReceBuff[UART3ReceIn++] = Res;
				else
					UART3ReceIn = 0;
				break;
			case 10:
				if(Res==0xFF)
					UART3ReceBuff[UART3ReceIn++] = Res;
				else
					UART3ReceIn = 0;
				break;
			default:
				UART3ReceBuff[UART3ReceIn++] = Res;
				break;
		}

		if(UART3ReceIn >= 11)
		{
			UART3ReceFullFlag = 1;	//數據完整接受完 
		}
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);//清除相對應的中斷位   清除中斷預處理位USART_ClearITPendingBit左移八位是USART_ClearFlag  
	}
	else if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)	// 發送中斷  USART_GetITStatus
	{
		USART_ClearITPendingBit(USART3, USART_IT_TXE);					// clear interrupt  清除中斷預處理位
	}	
}

void send_data()
{
	//刷新位置信息
if(timer8flag100ms==1)
{
timer8flag100ms=0;
	
			//發送協議頭 FE FE D1
			USART_SendData(USART1,0xFA);//向串口1發送數據
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			USART_SendData(USART1,0xFC);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束	
			//發送數據內容1			
			USART1_SendUnfixedData(crc16_data1,1);//空開1
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容2	
				USART1_SendUnfixedData(crc16_data2,1);//空開2
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容3		
				USART1_SendUnfixedData(crc16_data3,1);//空開3
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容4		
				USART1_SendUnfixedData(crc16_data4,1);//空開4  
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容5			
			USART1_SendUnfixedData(crc16_data5,2);//飲水機 空燒數據
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容設備接地的數據 (過載實驗)(1111 1111)(八個設備)
				USART1_SendUnfixedData(crc16_data6,1);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容7	 接地觸電 crc16_data7[0] 溼手觸電 crc16_data7[1]
				USART1_SendUnfixedData(crc16_data7,1);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容8		發送給串口的數據
				USART1_SendUnfixedData(crc16_data8,1);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束						
			//發送協議尾 FD FD
			USART_SendData(USART1,0xFD);//向串口1發送數據
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
			USART_SendData(USART1,0xFD);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}

}

void send_data_usart3(void)
{
	//刷新位置信息
if(timer8flag200ms==1)
{
timer8flag200ms=0;
	
			//發送協議頭 FE FE D1
			USART_SendData(USART3,0xFA);//向串口1發送數據
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			USART_SendData(USART3,0xFC);
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束	
			//發送數據內容1			
			USART3_SendUnfixedData(crc16_data1,1);//空開1
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容2	
				USART3_SendUnfixedData(crc16_data2,1);//空開2
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容3		
				USART3_SendUnfixedData(crc16_data3,1);//空開3
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容4		
				USART3_SendUnfixedData(crc16_data4,1);//空開4  
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容5			
			  USART3_SendUnfixedData(crc16_data5,2);//飲水機 空燒數據
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容設備接地的數據 (過載實驗)(1111 1111)(八個設備)
				USART3_SendUnfixedData(crc16_data6,1);
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容7	 接地觸電 crc16_data7[0] 溼手觸電 crc16_data7[1]
				USART3_SendUnfixedData(crc16_data7,1);
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			//發送數據內容8		發送給串口的數據
				USART3_SendUnfixedData(crc16_data8,1);
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束						
			//發送協議尾 FD FD
			USART_SendData(USART3,0xFD);//向串口1發送數據
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
			USART_SendData(USART3,0xFD);
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
}

}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章