串口通信——读串口信息

来源:互联网 发布:成都家电维修软件 编辑:程序博客网 时间:2024/05/19 19:44

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

  附上MSP430的程序

#include <msp430x14x.h>#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 <stdio.h>#include <windows.h>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;}


原创粉丝点击