串口通信——读串口信息

  该例程是基于MSP430单片机,利用430单片机内部的温度传感器将数据传到连接在单片机的433M无线模块上,然后由无线模块将数据发送出去,发送至连接在PC机上的433M,由C语言程序将433M的信息(包含通信协议)读取并且写入一个txt文件,代替串口调试助手。

  附上MSP430的程序

#include 
#include "Config.h"                     //????????,????IO????  
ulong temp;
ulong TemperF;                             //????
ulong TemperC;    
//***********************************************************************
//               MSP430IO初始化
//***********************************************************************
uchar i = 0;
//端口的初始化
void Port_init()
{
        P6SEL = 0x00;
        P6DIR = 0xff;                 //输出状态
	P4SEL = 0x00;
        P4DIR = 0xFF;                   //???????
        P5SEL = 0x00;
        P5DIR|= BIT5 + BIT6 + BIT7;     //??????????
}
void Send_Byte(uchar data)
{
  while(!(IFG1&UTXIFG0));          //?????????????
    U0TXBUF=data;
}

//*************************************************************************
//               MSP430串口的初始化
//*************************************************************************
void UART_Init()
{
  U0CTL|=SWRST + CHAR;                //??SWRST,8?????
  U0TCTL|=SSEL1;                      //SMCLK?????
  U0BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;                       //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                        //??????0,???9600bps
  ME1|=UTXE0;                         //UART0????
  ME1|=URXE0;                         //UART0????
  U0CTL&=~SWRST;
  IE1|=URXIE0;   
  
  
 /* U1CTL|=SWRST + CHAR;                //??SWRST,8?????
  U1TCTL|=SSEL1;                      //SMCLK?????
  U1BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
  U1BR0=baud_l;                       //N=UBR+(UxMCTL)/8
  U1MCTL=0x00;                        //??????0,???9600bps
  ME2|=UTXE1;                         //UART0????
  ME2|=URXE1;                         //UART0????
  U1CTL&=~SWRST;
  IE2|=URXIE1;   */   
  P3SEL|= BIT4 + BIT5;                //??IO????????,??UART??
  P3DIR|= BIT4;                       //??TXD0??????
}
//接收中断
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
  uchar data;
  data=U0RXBUF; 
  P6OUT = data;
}
//*************************************************************************
//	ADC初始化函数
//*************************************************************************
void ADC_Init()
{
  P6SEL|=0x01;                                    //??ADC??
  ADC12CTL0|= ADC12ON + SHT0_2 + REF2_5V + REFON; //ADC?????,16?CLK,????2.5V
  ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0;            //SMCLK????
  ADC12MCTL0= SREF0 + INCH_0;                     //??????????,??????0
  ADC12IE|= 0x01;                                 //????
  ADC12CTL0|= ENC;                                //?????
}

//*************************************************************************
//	ADC中断程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void) {
   temp = ADC12MEM0;         //保存转换结果
}

void Print_Str(uchar *s)
{
    while(*s != '\0')
    {
        Send_Byte(*s++);
    }
}
//*************************************************************************
//     主函数
//*************************************************************************
void main(void)
{ 
    WDT_Init();   //看门狗设置
    UART_Init();
    Clock_Init();                                     //系统时钟设置
    Port_init();                                      //系统初始化,设置IO口属性
    delay_ms(100);                                    //延时100ms
    ADC12CTL0 = SHT0_8 + REFON + ADC12ON;              //内部1.5V参考电压,打开ADC12模块,设置采样保持定时器
    ADC12CTL1 = SHP;                                   //采使用采样定时器
    ADC12MCTL0 = SREF_1 + INCH_10;                     //参考电压和通道选择
    ADC12IE = BIT0;                                    //ADC12MEM0
    ADC12CTL0 |= ENC;                                  //允许转换

    _BIS_SR(GIE);                                      //开启系统中断

    while(1) 
    {
        ADC12CTL0 |= ADC12SC;                          //开始采样并AD转换

        //oF = ((x/4096)*1500mV)-923mV)*1/1.97mV = x*761/4096 - 468
        //IntDegF = (ADC12MEM0 - 2519)* 761/4096
        TemperF = (temp - 2519) * 761;
        TemperF = TemperF / 4096;                      //简化的华氏温度转换公式

        //oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278
        //IntDegC = (ADC12MEM0 - 2692)* 423/4096
        TemperC = (temp - 2692) * 423;
        TemperC = TemperC / 4096;                      //简化的摄氏温度转换公式
        Send_Byte('!');                                //编写简单的通信协议,避免不同的433M之间数据接收混乱
        Send_Byte('!');
        Send_Byte('!');
        Send_Byte(TemperC/10+0x30);
        Send_Byte(TemperC%10+0x30);
        Send_Byte('C');
        Send_Byte(' ');
        Send_Byte('#');                                结束标志
        delay_ms(1500);
        _NOP();                                        //加入断点可用来观察TemperF和TemperC结果
    }
}

接着是C语言读取串口的C语言程序:

#include 
#include 
FILE * fileFP;
int main(void)
{
   FILE *fp;
   char temp;
   int count = 0, cnt = 0;
   //char buf[100];
   if((fp=fopen("com3", "r")) == NULL) puts("can't open the com/n");
   if((fileFP=fopen("testdata.txt", "w")) == NULL) puts("can't open the file/n");
   while(1)
   {
      temp = 0;
      fscanf(fp, "%c", &temp);
      if(temp == '!')                      //判断协议  
      	count++;
     if(temp == '#')
     	{
     		count = 0;
     		cnt++;                    // 接收数据计数
     	}
      if(count == 3&&temp != '!')
      {
         putchar(temp);
         fprintf(fileFP, "%c", temp);
      }
      else
      	Sleep(100);
     if(cnt >= 5){                       //设置每次读取五个数据
      	break;
      }
   }

   	fclose(fp);                      //关闭文件以及串口
        fclose(fileFP);
   return 0;
}


你可能感兴趣的:(物联网通信类小项目)