工具/软件:Code Composer Studio
您好!
我已成功地将 sim900与 msp430g2553连接。 现在、我的挑战是接收 sim900在我发送 at 命令后发回的字符串
"AT+CNMI"
我应该会收到号码、日期、时间和消息、并且我正在收到该消息。 但我无法存储和使用该字符串。
我想从该字符串中提取数字。 我可以在 rxbuffer 中接收字符,但我希望接收完整字符串。
我的代码如下:
//
#include
///----------------------------------
//与硬件相关的定义
///----------------------------------
#define UART_TXD 0x02 // P1.1上的 TXD (Timer0_A.OUT0)
#define UART_RXD 0x04 // P1.2上的 RXD (Timer0_A.CCI1A)
///----------------------------------
// 9600波特率 SW UART 的条件、SMCLK = 1MHz
///----------------------------------
#define UART_TBIT_DIV_2 (1000000 /(9600 * 2))
#define UART_TBIT (1000000/9600)
///----------------------------------
//用于全双工 UART 通信的全局变量
///----------------------------------
unsigned int txData;//用于 TX 的 UART 内部变量
unsigned char rxBuffer=0;//接收到 UART 字符
unsigned char number[50];
unsigned int i=0;
///----------------------------------
//函数原型
///----------------------------------
void TimerA_UART_init (void);
void TimerA_UART_TX (无符号字符字节);
void TimerA_uart_print (char *字符串);
///----------------------------------
// main()
///----------------------------------
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
IF (CALBC1_1MHz=0xFF)//如果校准常数被擦除
{
while (1);//请勿加载,陷阱 CPU!!
}
DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//将 DCOCLK 设置为1MHz
DCOCTL = CALDCO_1MHz;
P1OUT = 0x00;//初始化所有 GPIO
P1SEL = UART_TXD + UART_RXD;// TXD/RXD 引脚的计时器功能
P1DIR = 0xFF &~UART_RXD;//将除 RXD 外的所有引脚设置为输出
P2OUT = 0x00;
P2SEL = 0x00;
P2DIR = 0xFF;
_enable_interrupt ();
TimerA_UART_init ();//启动 Timer_A UART
TimerA_UART_PRINT ("at\r\n");
_DELAY_CYCLES (50);
TimerA_uart_print ("AT+CMGf=1\r\n");
_DELAY_CYCLES (50);
TimerA_UART_PRINT ("AT+CNMI=2、2、0、0、0\r\n");
_DELAY_CYCLES (50);
//__delay_cycles (5000000);
// TimerA_uart_print ("ready.\r\n");
对于(;)
{
//等待传入字符
_bis_SR_register (LPM0_bits);
// if (rxBuffer & 0x10) P1OUT |= 0x40;否则 P1OUT &=~0x40;// P1.6
if (rxBuffer=''')
{
for (i=0;i<25;i++)
{
TimerA_UART_TX (编号[i]);
}
}
}
}
///----------------------------------
//函数将 Timer_A 配置为全双工 UART 操作
///----------------------------------
空 TimerA_UART_init (空)
{
TACCTL0 = OUT;//将 TXD 空闲设置为 Mark ='1'
TACCTL1 = SCS + CM1 + CAP + CCIE;//同步、负边沿、捕捉、内部
TACTL = tassel_2 + MC_2;// SMCLK、以连续模式启动
}
///----------------------------------
//使用 Timer_A UART 输出一个字节
///----------------------------------
空 TimerA_UART_TX (无符号字符字节)
{
while (TACCTL0和 CCIE);//确保最后一个字符得到 TXd
TACCR0 = TAR;// TA 计数器的当前状态
TACCR0 += UART_TBIT;//直到第一位为止的一个位时间
TACCTL0 = OUTMOD0 + CCIE;//在 EQU0上设置 TXD、内部
txData =字节;//加载全局变量
txData |= 0x100;//向 TXData 添加标记停止位
txData <= 1;//添加空格起始位
}
///----------------------------------
//使用 Timer_A UART 打印一个字符串
///----------------------------------
空 TimerA_UART_PRINT (字符*字符串)
{
while (* string){
TimerA_UART_TX (*字符串++);
}
}
///----------------------------------
// Timer_A UART -发送中断处理程序
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A0_vector
_interrupt void Timer_A0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_A0_Vector)) Timer_A0_ISR (void)
其他
错误编译器不受支持!
#endif
{
静态无符号字符 txBitCnt = 10;
TACCR0 += UART_TBIT;//将偏移添加到 CCRx
if (txBitCnt = 0){//所有位 TXed?
TACCTL0 &=~CCIE;//所有位 TXed、禁用中断
txBitCnt = 10;//重新载入位计数器
}
否则{
if (txData & 0x01){
TACCTL0 &=~OUTMOD2;// TX 标记"1"
}
否则{
TACCTL0 |= OUTMOD2;// TX 空间'0'
}
txData >>= 1;
txBitCnt--;
}
}
///----------------------------------
// Timer_A UART -接收中断处理程序
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A1_vector
_interrupt void Timer_A1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_A1_vector)) Timer_A1_ISR (void)
其他
错误编译器不受支持!
#endif
{
静态无符号字符 rxBitCnt = 28;
静态无符号字符 rxData = 0;
switch (__evo_in_range (TA0IV、TA0IV_TAIFG){//使用计算出的分支
案例 TA0IV_TACCR1:// TACCR1 CCIFG - UART RX
TACCR1 += UART_TBIT;//将偏移添加到 CCRx
IF (TACCTL1和 CAP){//捕捉模式=起始位边沿
TACCTL1 &=~μ F 电容器;//将捕捉切换到比较模式
TACCR1 += UART_TBIT_DIV_2;//将 CCRx 指向 D0的中间
}
否则{
rxData >=1;
if (TACCTL1和 SCCI){//获取接收锁存中的等待位
rxData |= 0x80;
}
rxBitCnt--;
if (rxBitCnt = 0){//所有位 RXed?
rxBuffer = rxData;//存储在全局变量中
Number[i]= rxBuffer;
i++;
// rxData=0;
rxBitCnt = 8;//重新加载位计数器
TACCTL1 |= CAP;//切换比较至捕捉模式
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//从0 (SR)中清除 LPM0位
}
}
中断;
}
}
///---------------------------------------------------------
请帮助我编辑此内容、以便我可以接收字符串流并从该字符串中提取数据。
谢谢、
Shailav