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

📄 comms_uart.c

📁 MSP430电能测量程序,用的是电力线载波通讯.即PLC
💻 C
📖 第 1 页 / 共 2 页
字号:
   {  result=hex+'0'; }       // convert number
   else
   {  result=hex+('A'-10); }  // convert letter 
   
   return result;
}


//;--------------------------------------------------------------
//; This routine processes a received UART Command 
void Process_UART(void)
{
  int	temp;			// Temporary variable
  static long	SerialNumber;		// Long temporary variable
  unsigned int	parm;	//
  unsigned int	key;	// key to allow flash operation
  unsigned int	addr;
  unsigned int	data;
  unsigned long addrdata;  
	
  if (UART_Status & LineReceived)
  {
	 P1OUT |= 0x02;			// Turn on P1.1 to turn off User1 LED
     //UARTSet
     switch (UART_RX_Buffer[0])
     {
        case 'F':
        //FLASH memory commands
			_DINT(); // Disable Interrupts
			LCDtext ((unsigned char *) UART_RX_Buffer, 6, 6);	// Display one last message on LCD 
			switch (UART_RX_Buffer[1])
			{
			  case 'T':	// Set FLASH Tag
				key =GetHexNumber(&UART_RX_Buffer[2]);
				if ((key== LOAD_TAG) || (key== RUN_TAG))
				{					   
					flash_write_int16((int16_t*)&FlashTag, key);
					// Force branch to hardware reset vector				
					HardReset(); //!!!ACHTUNG!!! DOES NOT RETURN.
				}
				break;	
				
			  case 'E':	// Erase FLASH
				addr =GetHexNumber(&UART_RX_Buffer[2]);
				if ((addr>=0x8000) && (addr < 0xFE00))
				{
				    P1OUT &= ~0x01;    // clear P1.0 (Turn on User0 LED)
					flash_clr((int*)addr);					
					P1OUT |= 0x01;    // set P1.0 (Turn off USer0 LED)
				  
	                SendResult((unsigned char*)&addr, 2);	// Address    
					SendResult((unsigned char*)addr, 2);    // Data read back from flash
					SendString("\r");     
				}
				Display_Mode = display_off;		// Turn off the normal scrolling display update
												// so we can see the flash addresses 
				break;
			  
			  case 'W':	// Write 16 bits to FLASH
				addrdata =GetLongHexNumber(&UART_RX_Buffer[2]);
				addr = (addrdata>>16)& 0x0000FFFFL;
				data = addrdata & 0x0000FFFFL;
				flash_write_int16((int16_t*)addr, data); 
		   
                SendResult((unsigned char*)&addr, 2);	// Address    
                SendResult((unsigned char*)addr, 2);    // Data read back from flash
		        SendString("\r");  
				break;
		   
             case 'R':	// Read 16 bits from FLASH
				addr =GetHexNumber(&UART_RX_Buffer[2]);
                SendResult((unsigned char*)&addr, 2);	// Address    
                SendResult((unsigned char*)addr, 2);    // Data read back from flash
		        SendString("\r");     
				break;
		   
             case 'S':	// Read FLASH Tag
				SendResult((unsigned char*)&FlashTag, 2);    // Data read back from flash Tag
		        SendString("\r");     
				break;
		   
	          default:
             break;
         }           
         _EINT(); // Enable Interrupts
		break;

#ifndef FLASH_LOADER
       case 'S':
       //SetClock
         switch (UART_RX_Buffer[1])
         {
           case 'H':
               HOUR = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
           case 'M':
               MIN = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
           case 'S':
               SEC = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
            case 'Y':
               YEAR = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
           case 'O':
               MONTH = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
           case 'D':
               DAY = GetBCDNumber(&UART_RX_Buffer[2]);
             break;
		   
		   case	'V':
				calVoltage = ((float)GetNumber(&UART_RX_Buffer[2]))/10.0;
				SetAFEGain2(calVoltage);	// Set the AFE gain for best ADC resolution without saturatoin
             break;
		   case	'I':
				calCurrent = ((float)GetNumber(&UART_RX_Buffer[2]))/100.0;
             break;
		   case	'F':
				{
					int calFreqOld;
					calFreqOld = calFreq;
					calFreq = GetNumber(&UART_RX_Buffer[2]);
					if (calFreq != calFreqOld)
					{
						init_esp_parameter(1);	// Init. Embedded Signal Processing parameters	
					}
				}
             break;
		   
		   case 'N':
				SerialNumber = GetLongHexNumber(&UART_RX_Buffer[2]);
		        flash_replace_block( (char *)&SerialNumber_flash, (char *)&SerialNumber, sizeof(SerialNumber));// Write serial number to flash
			 break;
				
          default:
             break;
         }           
         break;

#ifdef withDisplay
       case 'D':
       //SetDisplay_Mode
           	LCDtext ((unsigned char *) "       ", LCD_SIZE, LCD_SIZE);  // Clear the display
			Display_Mode = GetNumber(&UART_RX_Buffer[1]);
			ModeSwitchDelay = 60;	// Stay in commanded display mode for 1 minute before auto-updating display mode
			Display_Hold = 2;		// Display units for 2 seconds before showing values
		  break;
   
		case 'W':
		// Write to LCD display
			Display_Mode = display_msgin;
			strcpy(msgin, (char *)&UART_RX_Buffer[1]);
			ModeSwitchDelay = 60;	// Stay in commanded display mode for 1 minute before auto-updating display mode
		  break;
		
#endif // withDisplay 
       case 'H':
       //send help text
              SendString(txt_help);
         break;

       case 'T':
       //SetTX_Mode
           TX_Mode = GetNumber(&UART_RX_Buffer[1]);
         break;
	   
       case 'Q':
       //Query
		   temp= TX_Mode;			// Temporarily save TX_Mode
           TX_Mode = GetNumber(&UART_RX_Buffer[1]);
           SendData();
		   TX_Mode = temp;			// Restore TX_Mode
         break;

       case 'V':
	   //Value
           parm = GetNumber(&UART_RX_Buffer[1]);
		   SendValue(parm);
         break;
	   
       case 'R':
           WDTCTL =0;  // Generate WDT violation Reset
         break;
	   
       case 'M':
       //SetMeasureMode
            TX_Mode = 0; //                  ; Clear running TX_Mode
            OP_Mode = request_cal;
            CalCyclCnt = calFreq*GetNumber(&UART_RX_Buffer[1]);    // Set Cycles
         break;

       case 'I':
       //Init
            _DINT(); // Disable Interrupts
            WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
            // Init Digital Hardware
            init_system();
            // Init. FLL and clocks  
            init_fll(10, defSystemFreq, 32);   
           // Init. analog front-end (sigma-delta ADC)
            init_analog_front_end();
            // Init. Embedded Signal Processing parameters
            init_esp_parameter(1);
            // Init. event generation and start measurement
            start_measurement();
            _EINT(); // Enable Interrupts
         break;
			
#ifdef withCalibration
       case '+':
            CalPlus(Cal_Mode);
         break;
   
       case '-':
            CalMinus(Cal_Mode);
         break;
	   
       case 'C':
       //Set Calibration mode
         {

            static char strbuf[20];

            _DINT(); // Disable Interrupts
			Cal_Mode = GetNumber(&UART_RX_Buffer[1]);
			SendString("Cal_Mode = ");
			SendFloat(Cal_Mode,0);
			SendString("\r");

			if (Cal_Mode == 0) 
            { 
			   SendString("Start Calibration : expecting "); 
			   SendFloat((int)(calVoltage*10),1); SendString("V / ");
			   SendFloat((int)(calCurrent*100),2); SendString("A / cosPhi = ");
			   SendFloat(calCosPhi*1000,3); SendString("\r");

               SendString("Old Data : \r ");
               
               l_to_a((long) (s_parameters.VRatio*1000),      strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) (s_parameters.IRatio*1000),      strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) (s_parameters.EnergyRatio*1000), strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) s_parameters.pSET_PHASECORR1,    strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) s_parameters.pSET_PHASECORR2,    strbuf); SendString(strbuf); SendChar('\r'); 

//               sprintf(strbuf, ldfs,(long) (s_parameters.VRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) (s_parameters.IRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) (s_parameters.EnergyRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR1); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR2); SendString(strbuf); SendChar('\r'); 
               //host_decu32((long) (s_parameters.VRatio*1000)); SendChar('\r'); 
               //host_decu32((long) (s_parameters.IRatio*1000)); SendChar('\r'); 
               //host_decu32((long) (s_parameters.EnergieRatio*1000)); SendChar('\r'); 
               //host_decu32((long) s_parameters.pSET_PHASECORR1); SendChar('\r'); 
               //host_decu32((long) s_parameters.pSET_PHASECORR2); SendChar('\r'); 
			}

			UART_Status &= ~LineReceived;
			UART_RX_Bytes = 0;
			_EINT(); // Enable Interrupts

            CalMode(Cal_Mode);

            _DINT(); // Disable Interrupts
  
            if (Cal_Mode == 0) 
            { 
               SendString("Calibration Done\r"); 
               SendString("New Data : \r ");

               l_to_a((long) (s_parameters.VRatio*1000),      strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) (s_parameters.IRatio*1000),      strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) (s_parameters.EnergyRatio*1000), strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) s_parameters.pSET_PHASECORR1,    strbuf); SendString(strbuf); SendChar('\r'); 
               l_to_a((long) s_parameters.pSET_PHASECORR2,    strbuf); SendString(strbuf); SendChar('\r'); 
               
//               sprintf(strbuf, ldfs,(long) (s_parameters.VRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) (s_parameters.IRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) (s_parameters.EnergyRatio*1000)); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR1); SendString(strbuf); SendChar('\r'); 
//               sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR2); SendString(strbuf); SendChar('\r'); 
               //host_decu32((long) (s_parameters.VRatio*1000)); SendChar('\r'); 
               //host_decu32((long) (s_parameters.IRatio*1000)); SendChar('\r'); 
               //host_decu32((long) (s_parameters.EnergieRatio*1000)); SendChar('\r'); 
               //host_decu32((long) s_parameters.pSET_PHASECORR1); SendChar('\r'); 
               //host_decu32((long) s_parameters.pSET_PHASECORR2); SendChar('\r'); 
            }
            if (Cal_Mode == 9) { SendString("Parameters saved\r"); }
			_EINT(); // Enable Interrupts
         }
         break;
#endif // withCalibration
#endif //ifndef FLASH_LOADER

     }

    UART_Status &= ~LineReceived;
    UART_RX_Bytes = 0;

  }
}
//No_Process_Uart
//        ret

#endif // withUARTComm

⌨️ 快捷键说明

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