⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bluetooth.c

📁 单片机像计算机发送、接收数据、串口中断、蓝牙通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
		F2M_GetResponse();													// Get Response from the F2M Bluetooth Plug
		F2M_SetMspUartBR(F2M_USART_COMM);					  // Back to the communication freq!
		return F2M_RSP_BUFFER[2];										// Return Status Byte 															  
}

unsigned char F2M_Decode()
{
		unsigned char dByte;
		static unsigned char state = F2M_S_INIT;
		static unsigned char sType = 0;
		static unsigned int  sVal = 0;
		static unsigned char ECG_Sampling = 0;
		while( !F2M_GetBufferFlag(F2M_RENEW_FLAG) );// Waiting for new data
		dByte = F2M_ReadBuffer();										// Read buffer
		
		switch (state) {
                case F2M_S_INIT:
                    state = (dByte == 0xaa) ? F2M_S_AA1 : F2M_S_INIT;
                    break;
                case F2M_S_AA1:
                    state = (dByte == 0xaa) ? F2M_S_AA2 : F2M_S_INIT;
                    break;
                case F2M_S_AA2:
                    state = (dByte == 0xaa) ? F2M_S_AA3 : F2M_S_INIT;
                    break;
                case F2M_S_AA3:
                    state = (dByte == 0xaa) ? F2M_S_AA4 : F2M_S_INIT;
                    break;
                case F2M_S_AA4:
                    if (dByte != 0xaa)					 // remember type 
                    {   
                        sType = dByte;                       
                        state = F2M_S_TYPE;
                    }
                    // else stay in this state
                    break;
                case F2M_S_TYPE:								 // remember low
                    sVal =  dByte;
                    state = F2M_S_LOW;
                    break;
                case F2M_S_LOW:
                    // remember high
                    sVal |= (((int)dByte) << 8);
                    //decoderListener_.insertElement(sType, sVal);
                    if(sType == 0x11)
                    {
                    		if(ECG_Sampling == 0)
                    		LCD_PlotLine(((sVal>1200)?(sVal-1200):0));
                    		if((++ECG_Sampling)==F2M_ECG_SAMPLING)ECG_Sampling = 0;	
                    }
                    if(sType == 0x21)LCD_PlotAcc(((sVal>1700)?(sVal-1700):0),0);
                    if(sType == 0x22)LCD_PlotAcc(((sVal>1700)?(sVal-1700):0),1);
                    if(sType == 0x32)LCD_PrintStrapPara(sVal,0x32);
                    if(sType == 0x42)LCD_PrintStrapPara(sVal,0x42);
                    state = F2M_S_HIGH;
                    break;
                case F2M_S_HIGH:
                    if (dByte == 0xaa)
                        state = F2M_S_AA1;
                    else {
                        // remember type
                        sType = dByte;                       
                        state = F2M_S_TYPE;
                    }
                    break;
            }
            
            return 0;
		
}


void F2M_EKG_Measuring()
{
		 unsigned char Tchar;
		 vTaskSuspendAll();
		 // vTaskSuspend(Timer_Handle);
		 //ClearLCD();
		 /*
		
		 F2M_ClrBufferFlag(F2M_PAIRSEL_FLAG);
	 									 	LCD_RollingDisplay("Entering HCM...");
	 									 	Tchar  = F2M_EnterCommandMode();
									 		if( Tchar == 0x01)						// Enter HCM
									 				LCD_RollingDisplay("  Succeed!");
									 		else
									 				LCD_RollingDisplay("  Failed!");
	 									 	
	 									 		while(!F2M_GetBufferFlag(F2M_PAIRSEL_FLAG))
										 	{
	 									 	LCD_RollingDisplay("Inquiry...");		
										 	
										 				
												 	LCD_RollingDisplay("Waiting...");	vTaskDelay(10);
												 				
												  Tchar = F2M_Inquiry();
												 	if(Tchar == 0x01)				// Set Baudrate		
												 				LCD_RollingDisplay("Inquiry finished!");
												 	else
												 	{
												 				if (Tchar == 0xfc)
												 					{
												 						//num[0]++;
												 						//LCD_RollingDisplay(num);
												 					}
												 					else
												 					{
												 						LCD_RollingDisplay("Failed No Idea");
												 						
												 					}		
												 					
												 	}
												 	
										 			LCD_RollingDisplay("Inquiry again...");
										 				}
										 				
											
										 	
			
											 	LCD_RollingDisplay("Connecting...");
		 	if(F2M_SetConnectRule(F2M_PAIR._.ADDRESS) == 0x01)				// Set Connect rule		
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 				
		 				_F2M_CLR_PIO2();
		 				

			LCD_RollingDisplay("Exit HCM...");			
		 	
		 	if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		
		*/
		
		F2M_SetBufferFlag(F2M_COMMUNICATION_MODE_FLAG);
		F2M_SetMspUartBR(F2M_USART_COMM);					  // Back to the communication freq!
		ClearLCD();
		_F2M_CLR_PIO2();
		while(_F2M_CHK_PIO3()==0);
											 		
											 		/*
											 		if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
									 						LCD_RollingDisplay("Succeed!");
									 				else
									 						LCD_RollingDisplay("Failed!");
									 					*/	
						
						_LCD_SET_DISPLINE(0);
						LCD_PrintStrapPara(0);
						KeyboardStatus = 0;
						while(KeyboardStatus==0)
						{
								F2M_Decode();
						}
						//KeyboardStatus = 0;
						
	 					_F2M_SET_PIO2();
	  				//vTaskResume(Timer_Handle);
	 					//Menu_Refresh();
	 					Go2Menu(CurrentMenu);
	 					xTaskResumeAll();
}


static portTASK_FUNCTION_PROTO( vF2MBTTask, pvParameters );

void vStartF2MBTTasks( unsigned portBASE_TYPE uxPriority )
{
		xTaskCreate( vF2MBTTask, ( const signed portCHAR * const ) "F2MBT", F2MBT_STACK_SIZE, NULL, uxPriority, &F2MBT_Handle );
}




static portTASK_FUNCTION( vF2MBTTask, pvParameters )
{
		char Tchar;
		char i,j,k;
		char num[] = "0 Failed 0xFC";
		portCHAR CM_Message;

		( void ) pvParameters;


		 		/*		
		 	LCD_RollingDisplay("Exit HCM...");			
		 	
		 	if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 				
		 				LCD_Delay(60000);
		 	
		 			LCD_RollingDisplay("Entering HCM...");
		 	if(F2M_EnterCommandMode() == 0x01)						// Enter HCM
		 				LCD_RollingDisplay("  Succeed!");
		 	else
		 				LCD_RollingDisplay("  Failed!");
		 				
		 				LCD_Delay(60000);
		 				
		 				
		 	*/
		 	//LCD_Delay(60000);
	
		 	
		 	
		 	/*
		 	LCD_RollingDisplay("Connecting...");
		 	if(F2M_SetConnectRule(F2M_PAIR._.ADDRESS) == 0x01)				// Set Connect rule		
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 				
		 	F2M_Command(0x67,0x03,(unsigned char*)PairingSetting);			// Set Pairing Parameters
			F2M_GetResponse();	
			
			LCD_RollingDisplay("Exit HCM...");			
		 	
		 	if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 	
			F2M_SetBufferFlag(F2M_COMMUNICATION_MODE_FLAG);
			
			ClearLCD();
			  _LCD_SET_DISPLINE(0);
			  LCD_PrintStrapPara(0); 
			  while(_F2M_CHK_PIO3()==0);
			  vTaskSuspendAll();
			  */
			  Tchar = 0xfc;
			 xQueueSend( F2MBT_CM_Queue, ( void * ) &Tchar, ( portTickType ) 10 );
			for(;;)
		 	{
		 		if( xQueueReceive( F2MBT_CM_Queue, &CM_Message, ( portTickType ) F2M_TASK_WAIT_MSG_TICKS ) )
		 		{	
		 				switch(CM_Message)
		 				{
		 						
		 						case 0xfc:
		 						{
		 								ClearLCD();
			  						_LCD_SET_DISPLINE(0);
			  						/*
			  						k = 0;
			  						for(;;)
			  						{
			  							for(j = 0 ; j< NUM_TEST.height;j++)
				  						{
				  							LCD_Cursor2yx(NUM_TEST.y+j,NUM_TEST.x);
				  							for(i = 0 ; i< NUM_TEST.length;i++)
				  							{
				  									LCD_WRT_DAT(NUM_TEST.content[k*NUM_TEST.height*NUM_TEST.length+j*NUM_TEST.length+i]);
				  							}
				  						}
				  						i = 5;
			  						}*/
			  						
			  						for(i=0;i<8;i++)
			  						{
			  								LCD_Cursor2yx(i,5);
			  								for(j=0;j<128;j++)
			  								{
			  										LCD_WRT_DAT(LOGO_CHAR[i*128+j]);	
			  								}	
			  						}
			  						
		 								break;
		 						}
		 						case F2M_TASK_INIT:
		 						{
				 						
										_F2M_CLR_RESET();
										vTaskDelay(1);
										_F2M_SET_RESET();
										vTaskDelay(9);						//Delay 900ms for preparation entering the Command Mode
				 						LCD_DISPLAY_MODE(LCD_DISPLAY_MODE_1);
		    						ClearLCD();
										F2M_InitUART();                           // Init Bluetooth UART
										LCD_RollingDisplay("Entering HCM...");
									 	if(F2M_EnterCommandMode() == 0x01)						// Enter HCM
									 				LCD_RollingDisplay("  Succeed!");
									 	else
									 				LCD_RollingDisplay("  Failed!");
									 				
									 				LCD_Delay(60000);
								
									 	LCD_RollingDisplay("Setting BM...");			
									 	if(F2M_SetOperationMode(0x01) == 0x01)				// Set Bluetooth Slave	
									 				LCD_RollingDisplay("  Succeed!");
									 	else
									 				LCD_RollingDisplay("  Failed!");
									 				
									 				LCD_Delay(60000);
									 				
									 	LCD_RollingDisplay("Setting BR...");			
									 	
									 	if(F2M_SetF2MBaudrate() == 0x01)				// Set Baudrate		
									 				LCD_RollingDisplay("  Succeed!");
									 	else
									 				LCD_RollingDisplay("  Failed!");									 				
									 	
										F2M_Command(0x67,0x03,(unsigned char*)PairingSetting);			// Set Pairing Parameters
										F2M_GetResponse();	
													 
									 	LCD_RollingDisplay("Exit HCM...");			
		 	
				 						if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
									 				LCD_RollingDisplay("Succeed!");
									 	else
									 				LCD_RollingDisplay("Failed!");									 				
									 		
									 		break;
		 						}
		 						case F2M_TASK_INQUIRY:
		 						{
	 									 	
	 									 	F2M_ClrBufferFlag(F2M_PAIRSEL_FLAG);
	 									 	LCD_RollingDisplay("Entering HCM...");
	 									 	Tchar  = F2M_EnterCommandMode();
									 		if( Tchar == 0x01)						// Enter HCM
									 				LCD_RollingDisplay("  Succeed!");
									 		else
									 				LCD_RollingDisplay("  Failed!");
	 									 	
	 									 		while(!F2M_GetBufferFlag(F2M_PAIRSEL_FLAG))
										 	{
	 									 	LCD_RollingDisplay("Inquiry...");		
										 	
										 				
												 	LCD_RollingDisplay("Waiting...");	vTaskDelay(10);
												 				
												  Tchar = F2M_Inquiry();
												 	if(Tchar == 0x01)				// Set Baudrate		
												 				LCD_RollingDisplay("Inquiry finished!");
												 	else
												 	{
												 				if (Tchar == 0xfc)
												 					{
												 						num[0]++;
												 						LCD_RollingDisplay(num);
												 					}
												 					else
												 					{
												 						LCD_RollingDisplay("Failed No Idea");
												 						
												 					}		
												 					
												 	}
												 	
										 			LCD_RollingDisplay("Inquiry again...");
										 				}
										 				
											
										 	
			
											 	LCD_RollingDisplay("Connecting...");
		 	if(F2M_SetConnectRule(F2M_PAIR._.ADDRESS) == 0x01)				// Set Connect rule		
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 				
		 				_F2M_CLR_PIO2();
		 				

			LCD_RollingDisplay("Exit HCM...");			
		 	
		 	if(F2M_ExitCommandMode() == 0x01)						// exit HCM	
		 				LCD_RollingDisplay("Succeed!");
		 	else
		 				LCD_RollingDisplay("Failed!");
		 	
		 	break;			
		 						}
		 		}
		 		
		 		
		 					// suspend itself
		 	}
			vTaskSuspend(NULL);	
		 		}

}

__interrupt void usart1_rx (void);
USART1RX_ISR(usart1_rx)
__interrupt void usart1_rx (void)
{
  //while (!(IFG2 & UTXIFG1));                // USART0 TX buffer ready?
  //TXBUF1 = RXBUF1;   												// RXBUF0 to TXBUF0
  	portDISABLE_INTERRUPTS();
  	_F2M_SET_CTS();															// Flow Control	
	  UART_BUFFER[pBUF_WRT] = RXBUF1;             // Buffer Writing
	  BUFFER_FLAG |= F2M_RENEW_FLAG;							// Set Buffer Renew flag
	  pBUF_WRT++;
	  if(pBUF_WRT == F2M_BUFFER_LENGTH)
	  {
	  	 	pBUF_WRT = 0;																// Rewriting the Buffer
	  	 	BUFFER_FLAG |=	F2M_LOOP_FLAG;							// Set Rewirting flag
	  }
	  if( (pBUF_WRT >= pBUF_RED) && (BUFFER_FLAG & F2M_LOOP_FLAG) )
	  		 BUFFER_FLAG |= F2M_OVERFLOW_FLAG;					// Overflow... 
		else																						// If overflow, the CTS keep high to avoid new data from the serial port 
				_F2M_CLR_CTS();															// Flow Control  
		portENABLE_INTERRUPTS();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -