历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2021年01月26日 | msp430g2553串口接收字符串_接收指令

2021-01-26 来源:eefocus

串口接收中断函数一次只能接收一个字,接收一个字符串并存下常用方法:
①设置标志位:如在末尾加入标志位’r’,’n’;前缀+数据+后缀
②定时判断接收数据的长度,如果在规定时间内,长度没有什么变化,证明已经接收了任意长度的字符。
下面我用设置标志位的方式实现接收字符串,并根据不同字符串执行不同的操作。

msp430g2553串口通信
2、接收字符串:
在串口接收中断函数中调用void Receive(char x)函数,每次出现E5(前缀)开始存储字符串,到E6标志(后缀)出现为止,结束存储;
char a_a[13]={0}为全局字符串,char b_b[13]={0}为局部字符串,这两个字符串的长度决定了接收的字符串长度,在13内都可,可以根据需要改变;a_a为全局变量,会保留前一次存储结果,本次位数少于上次时,只刷新本次位数,a_a中上次多的位任保留,因此要一个局部的b_b,每次结束存储后把a_a中前rxcnt位赋给b_b;
3、指令执行
用了 #include "string.h"库中int a=strcmp(s,m_ready)函数
(把m_ready字符串和接收的指令相比)
和 if(a==0)
{
putstr(n_feature);//填写要执行的内容
}

#include

#include "string.h"



void putchar(unsigned char tx_data);

void putstr(char *s);

void Receive(char x);

void result(char *s);



char RX_DATA;

char rxcnt=0;

char temp1;

char temp2;

char flag=0;

char *string1="MADE BY PengchengITn";

char string2[]="G2553 UARTnREADY!!!n";

char n_feature[]="E5050958443130303031FDE6";

char m_ready[11]="E5010001E6";

char m_start[13]="E506010108E6";

char m_emulate[13]="E51B01021EE6";

char m_up[11]="E5190019E6";

char m_down[11]="E51A001AE6";

char m_auto[13]="E51B01011DE6";

char m_end[11]="E51C001CE6";

char a_a[13]={0};


int main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  if (CALBC1_1MHZ==0xFF) // If calibration constant erased

  {

    while(1);                               // do not load, trap CPU!!

  }

  DCOCTL = 0;                               // Select lowest DCOx and MODx settings

  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO

  DCOCTL = CALDCO_1MHZ;

  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD

  P1DIR = BIT0;                             //p1.0外接LED为输出状态

  P1OUT &= ~BIT0;

  UCA0CTL1 |= UCSSEL_2;                     // SMCLK

  UCA0BR0 = 104;                            // 1MHz 9600

  UCA0BR1 = 0;                              // 1MHz 9600

  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1

  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

  IE2 |= UCA0RXIE;                     // Enable USCI_A0 RX interrupt

  putstr(string1);

  putstr(string2);

  __bis_SR_register(LPM0_bits+GIE);       // Enter LPM0, interrupts enabled


}


void Receive(char x)

{

 temp2=temp1;

 temp1=x;

 if((temp1=='5')&&(temp2=='E'))

 {

   flag=1;

   rxcnt=0;

   memset(a_a,0,0);

   a_a[0]='E';

   rxcnt=1;

 }

 if((temp1=='6')&&(temp2=='E'))

 {

   flag=0;

   a_a[rxcnt]='6';

   char b_b[13]={0};

   strncpy(b_b,a_a,rxcnt+1);

 //  putstr(b_b);

       

  result(b_b);

 }

 if(flag==1)

 {

a_a[rxcnt]=x;

rxcnt++;

}

}


void result(char *s)

{

        int a=strcmp(s,m_ready);

        int b=strcmp(s,m_end);

        int c=strcmp(s,m_up);

        int d=strcmp(s,m_down);

        int e=strcmp(s,m_start);

        int f=strcmp(s,m_emulate);

        int g=strcmp(s,m_auto);

         if(a==0)

          {

            putstr(n_feature);

          }

          if(b==0)

          {

            putstr("End of the test");

          }

          if(c==0)

          {

            putstr("The lights have been turned on");

          }

         if(d==0)

         {

           putstr("The lights have been dimmed");

         }

          if(e==0)

         {

           putstr("Begin to testn");

            putstr("E51101 A FCS+E6n...");

         }

          if(f==0)

         {

           putstr("Enter simulation mode");

         }

          if(g==0)

         {

           putstr("Enter auto mode");

         }

}


void putchar(unsigned char tx_data) //发送字符函数

{

while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer为空

UCA0TXBUF = tx_data;// TX -> RXed character? 发送字符c

}


void putstr(char *s)//发送字符串函数

{

IE2 &= ~UCA0RXIE;//发送时先关闭接收中断,不接收

//如果没有发完,就继续循环发送

while((*s)!='')

{

putchar(*s);

s++;

}

IE2 |= UCA0RXIE; //发送完了打开接收中断

}


//  Echo back RXed character, confirm TX buffer is ready first

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

#elif defined(__GNUC__)

void __attribute__ ((interrupt(USCIAB0RX_VECTOR))) USCI0RX_ISR (void)

#else

#error Compiler not supported!

#endif

{

while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer为空

//UCA0TXBUF = UCA0RXBUF; // TX -> RXed character? 发送接收到的数据

RX_DATA=UCA0RXBUF;

Receive(RX_DATA);               

}


硬件测试用板(TI的MSP-EXP430G2ET)

注意:图中绿圈跳帽的接法!

推荐阅读

史海拾趣

GuangDong Province MengCo Semiconductor Co., Ltd公司的发展小趣事
根据实际应用需求调整制动参数,如制动时间、制动电流等,以达到理想的制动效果。
Epitex Inc公司的发展小趣事

Epitex一直将品质管理作为公司的核心竞争力之一。他们建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制。同时,Epitex还不断引进先进的生产设备和检测技术,确保产品的稳定性和可靠性。

此外,Epitex还非常重视员工的培训和素质提升。他们定期组织员工进行技能培训和质量意识教育,提高员工的专业素养和工作质量。这种持续改进的精神使得Epitex的产品质量得到了客户的高度认可。

FCI / Amphenol公司的发展小趣事

FCI公司起源于1988年,当时由Framatome组建,其初衷是作为核能领域外的一个多样化经营项目。然而,随着市场的变化和公司的战略调整,FCI逐渐将重心转向连接器制造。经过20多次的精心收购和策略性扩张,FCI在短短20年内便成长为全球最大的连接器制造公司之一。这一转变不仅展现了FCI对市场敏锐的洞察力,也体现了其卓越的管理能力和执行力。

Abbotec Incorporated公司的发展小趣事

Abbotec Incorporated公司自成立以来,一直致力于电子技术的研发与创新。在某一年,公司研发团队成功开发出一款具有划时代意义的芯片,这款芯片在性能上大幅提升,同时降低了能耗。这一技术突破迅速引起了业界的关注,Abbotec因此获得了大量的订单,公司规模迅速扩大。

Gemmy Electronics Co Ltd公司的发展小趣事
可能是由于电源线路未插好、电源开关未打开或电源本身故障导致。
Alorium Technology公司的发展小趣事
首先确认电源线路是否插好、电源开关是否打开,并使用万用表检测电源电压是否正常。

问答坊 | AI 解惑

基于ADmC812和DSP的实时数据采集系统设计

ADmC812是ADI公司的以8051(8052)内核为控制核心的新型微转换器。由于ADmC812内部集成了大量的外围设备。它本身就是一个完全可编程、自校准、高精度的数据采集系统,可以取代传统的MCU+A/D+ROM+RAM高成本、大体积产品,尤其是它的高精度和高速度A/D ...…

查看全部问答>

你DIY的目的是......?

欢迎大家参与调查,并发表您宝贵的一间,谢谢!…

查看全部问答>

《ARM嵌入式应用开发技术白金手册》源代码.rar

《ARM嵌入式应用开发技术白金手册》源代码.rar…

查看全部问答>

单片机网络简介

单片机网络简介 2009-4-9 作者:上海卓岚信息科技有限公司 来源:zlmcu 1.概述 目前单片机网络技术越来越受到重视,特别是51单片机网络通信在很多实际项目中都是需要的。随着普适计算(pervasive computing)概念越来越深入人心,普适计算所倡 ...…

查看全部问答>

两星期了,唤醒死机Flash初始化不正确??高分悬赏

我系统唤醒后不能正常使用,到最后慢慢死机,论坛上目前也不少朋友碰到了这个问题。 我参考了网上的很多资料,很多朋友说是Flash初始化有问题。 我觉得我也是flash初始化那块有错误了,BSP包里唤醒的时候是这样进行Flash初始化的: // Initializ ...…

查看全部问答>

我减掉了一个BSP中的一个驱动,编译出错。

我在smdk2440a.bat文件中加入 set BSP_NOCAMERA=1 在 platform.bib中也注释了 camera 部分,前加分号。 编译出错: BUILD: [01:0000000560:INFO  ] hwctxt.cpp BUILD: [01:0000000561:INFO  ] Stubbing the PPLOG functio ...…

查看全部问答>

EVC下ClassView中一个类忽然消失

各位兄弟: 我在编写EVC程序时 在CLASSVIEW中有个DlgSeriesSetup的类忽然消失了 请问怎么解决?? 上网找解决方法都是VC下的:删了clw文件或者删除   ncb,重试。 但是在EVC下的工程中没发现这两个文件!!!!!!!!! 急 !! ...…

查看全部问答>

武汉招聘:

精通施奈德PLC,要有实际经验,有一定的自主支配时间。待遇面谈。联系方式:027-87792427;E@mail:bb0912@163.com…

查看全部问答>

老师让我们做的,我也不知道错哪了?大虾们看看,,,XIEIXE

MSP430 X22X4学习板 4*4键盘在自己焊的两个七段数码管显示 #include <msp430x22x4.h> int tmp; typedef unsigned int uchar; typedef unsigned int uint; uchar cnt = 0; //位码 uchar scandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0 ...…

查看全部问答>

TI技术文章:基于 KeyStone DSP 的多核视频处理技术

随着越来越多的移动手持终端支持视频功能,对于流媒体内容及实时通信的网络支持需求也在显著上升。虽然对已部署的 3G 媒体网关进行升级可以支持较低的分辨率和帧速率,但这种由于自身的有限处理能力而进行的升级并不能满足视频成为主流应用的需求。 ...…

查看全部问答>