This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR4133:尝试通过SIM800 GSM模块传输数据

Guru**** 2613075 points
Other Parts Discussed in Thread: MSP430FR4133

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/664388/ccs-msp430fr4133-trying-to-transmit-data-via-sim800-gsm-module

部件号:MSP430FR4133

工具/软件:Code Composer Studio

您好,

  我正在使用MSP430FR4133启动板。 我正在尝试从MSP430FR4133LP向GSM模块发出AT命令并获得相应的响应。 但当我发送"at\r\n"时,我只在接收缓冲区中收到一个空格(0x000A)。如果我尝试使用循环或中断将接收到的字符逐个保存在字符数组中,它只显示零值。最终需要是, 从SIM800L发送SMS。 我使用的代码附在下面

#include <MSP4S.h>
#include <String.h>
#include <stdint.h>
#include <stdlib.h>
void UART_TX();
void Init_gPIO();
//const char TXData ='at;

无符号char CtrlZ =(char)26;
unsigned char at[4]={"at\r\n"};
unsigned char cmgf[13]={"AT+CMGF=1\r"};
无符号字符cmgs[30]={"AT+CMGS=\"+91.8015万989208\"\r\n"}98.9208万};
unsigned char msg[10]={"hello\r"};
无符号的字符RXData;
内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

Int索引= 0,i = 0;
长int k = 0;
Int ind = 0;

unsigned char tmpLatLong [10]={0};
无符号char txfrBuffer[1]='a';
//配置GPIO
init_gPIO();
PM5CTL0 &=~LCKLPM5;//禁用GPIO开机默认高阻抗模式
//激活1先前配置的端口设置

__bis_sr_register(SCG0);//禁用FLL
CSCTL3 |= SELREF_REFCLK;//将REFO设置为FLL参考源
CSCTL0 =0;//清除DCO和MOD寄存器
CSCTL1 &=~(DCORSEL_7);//首先清除DCO频率选择位
CSCTL1 |= DCORSEL_3;//设置DCO =8MHz
CSCTL2 = FLLD_0 + 243;// DCODIV = 8MHz
__DELAY周期(3);
__BIC_SR_REGISTER(SCG0);//启用FLL
while (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//轮询,直到FLL锁定

CSCTL4 = SELMS__DCOCLKDIV | LAST__REFCLK;//将默认的REFO (~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
//默认DCODIV为MCLK和SMCLK源

//配置UART引脚
P1SEL0 || BIT0 | BIT1;//将2-UART引脚设置为第二个功能

//配置UART
UCA0CTLW0 |= UCSWRST;
UCA0CTLW0 |= UCSSEL__SMCLK;

//波特率计算
// 80万/(16*9600)=9600= 52.083
//分数部分= 0.083
//用户指南表14-4:UCBRSx = 0x49
// UCBRFx = int ((52.083 -52)*16)= 1
UCA0BR0 = 52;// 80万/16/9600</s>9600
UCA0BR1 = 0x00;
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;

UCA0CTLW0 &=~UCSWRST;//初始化eUSCI
UCA0IE = UCTXIE | UCRXIE;//启用USI_A0 RX中断

while (!(UCA0IFG和UCTXIFG));

UART_TXN (&AT[0],4);
K = 20万;
执行{
-k;
}同时(k >0);
// UART_TXN (&cmgf[0],sizeof (cmgf));
// k = 20万;
//执行{
//--k;
//}同时(k >0);
//
// UART_TXN (&cmgs[0],sizeof (cmgs));
// k = 20万;
//执行{
//--k;
//}同时(k >0);
//
// UART_TXN (&msg[0],sizeof (msg));
// k = 200万;
//执行{
//--k;
//}同时(k >0);
//
// UART_TXN(&CtrlZ, sizeof(CtrlZ);
// k = 20万;
//执行{
//--k;
//}同时(k >0);
同时(1);

//__bis_sr_register(LPM3_bits|GIE);//输入LPM3,中断已启用
//__no_operation();//用于调试器
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_A0_vector
__interrupt void USI_A0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_A0_vector))) USI_A0_ISR (void)
#否则
错误编译器不受支持!
#endif

Switch(__偶 数_in_range(UCA0IV,USI_UART_UCTXCPTIFG))

案例USI_NONE:中断;
案例USI_UART_UCRXIFG:
while (!(UCA0IFG和UCRXIFG));
RXData = UCA0RXBUF;
__no_operation();
中断;
案例USI_UART_UCTXIFG:中断;
案例USI_UART_UCSTIFG:中断;
案例USI_UART_UCTXCPTIFG:中断;
默认值:中断;
}
}

void Init_gPIO()

P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF;P4REN = 0xFF;
P5REN = 0xFF;P6REN = 0xFF;P7REN = 0xFF;P8REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
}

void UART_TXN(无符号字符*str,int大小)

INT I = 0;
while (大小> 0)

UCA0TXBUF = str[I++];
while (!(UCA0IFG和UCTXIFG));
大小--;
}
}

是否有使用注册级别程序从CSS中的MSP430FR4133使用SIM800L发送SMS的示例??

提前感谢...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kamalesh,

    我建议您以不同的方式处理此问题:
    *在没有GSM模块的情况下,通过回波设置(Tx连接至Rx)测试电路/代码,确认MCU/RxTx工作正常。
    *在没有MCU电路的情况下,使用适配器(USB-RS232等)将GSM模块连接到串行终端,并通过终端发出AT命令以确认模块按预期运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Mike Tooma,
    我已经使用Arduino检查了GSM模块,它工作正常,我还尝试通过TX RX将字符串从MSP430传输到Arduino,该模块也工作正常。 但问题是,当我尝试向GSM发出AT命令时, 我无法了解这些值如何存储在接收缓冲区中,但最终存储在传输缓冲区和接收缓冲区中的值相同,SMS不发送。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kamalesh,

    不应在中断ISR中使用"while (!(UCA0IFG&UCRXIFG);"。  您可以使用阵列存储接收数据并检查其是否正确。 MSP430FR4133 LaunchPad中有一个USB到串行工具。 您可以使用它和PC中的串行终端来确认LaunchPad和 GSM模块均按预期运行。 确保接收和发送的值正确。

    如果我的帖子有助于解决您的问题,请单击  验证答案    按钮 

    冬季,

    搜索 E2E! 您的问题可能已得到解答!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Winter Yu,

    我使用相同的代码尝试过,现在我在手机中收到了一条SMS,但我只是收到了一条空白消息...
    感谢您的回复

    #include <MSP4S.h>
    #include <String.h>
    #include <stdint.h>
    #include <stdlib.h>

    void Init_gPIO();
    void UART_TXN();
    //const char TXData ='at;

    无符号char CtrlZ =(char)26;
    unsigned char at[4]={"at\r\n"};
    unsigned char cmgf[13]={"AT+CMGF=1\r"};
    无符号字符cmgs[30]={"AT+CMGS=\"+91.8015万989208\"\r\n"}98.9208万};
    char* msg ="hello";
    无符号的字符RXData;
    内部主(无效)

    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

    Int索引= 0,i = 0;
    长int k = 0;
    Int ind = 0;

    unsigned char tmpLatLong [10]={0};
    无符号char txfrBuffer[1]='a';
    //配置GPIO
    init_gPIO();
    PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式
    //激活1先前配置的端口设置

    __bis_sr_register (SCG0); //禁用FLL
    CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源
    CSCTL0 = 0; //清除DCO和MOD寄存器
    CSCTL1 &=~(DCORSEL_7); //首先清除DCO频率选择位
    CSCTL1 |= DCORSEL_3; //设置DCO = 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    __DELAY周期(3);
    __BIC_SR_REGISTER (SCG0); //启用FLL
    while (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//轮询,直到FLL锁定

    CSCTL4 = SELMS__DCOCLKDIV | LAST__REFCLK;//将默认的REFO (~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
    //默认DCODIV为MCLK和SMCLK源

    //配置UART引脚
    P1SEL0 || BIT0 | BIT1; //将2-UART引脚设置为第二个功能

    //配置UART
    UCA0CTLW0 |= UCSWRST;
    UCA0CTLW0 |= UCSSEL__SMCLK;

    //波特率计算
    // 80万/(16*9600)=9600= 52.083
    //分数部分= 0.083
    //用户指南表14-4:UCBRSx = 0x49
    // UCBRFx = int ((52.083 -52)*16)= 1
    UCA0BR0 = 52; // 80万/16/9600</s>9600
    UCA0BR1 = 0x00;
    UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;

    UCA0CTLW0 &=~UCSWRST; //初始化eUSCI
    UCA0IE = UCTXIE | UCRXIE; //启用USI_A0 RX中断

    while (!(UCA0IFG和UCTXIFG));

    UART_TXN (&AT[0],4);
    K = 20万;
    执行{
    -k;
    }同时(k >0);
    UART_TXN (&cmgf[0],sizeof (cmgf));
    K = 20万;
    执行{
    -k;
    }同时(k >0);

    UART_TXN (&cmgs[0],sizeof (cmgs));
    K = 20万;
    执行{
    -k;
    }同时(k >0);

    UART_TXN (&txfrBuffer[0],sizeof (txfrBuffer));
    K =200万;
    执行{
    -k;
    }同时(k >0);

    UART_TXN ("\r\n",sizeof ("\r\n"));
    K =200万;
    执行{
    -k;
    }同时(k >0);

    UART_TXN (&CtrlZ,大小(CtrlZ));
    K = 20万;
    执行{
    -k;
    }同时(k >0);
    同时(1);

    //__bis_sr_register (LPM3_bits|GIE); //输入LPM3,中断已启用
    //__no_operation();//用于调试器
    }

    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=USI_A0_vector
    __interrupt void USI_A0_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (USI_A0_vector))) USI_A0_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    Switch(__偶 数_in_range(UCA0IV,USI_UART_UCTXCPTIFG))

    案例USI_NONE:中断;
    案例USI_UART_UCRXIFG:
    while (!(UCA0IFG和UCRXIFG));
    RXData = UCA0RXBUF;
    __no_operation();
    中断;
    案例USI_UART_UCTXIFG:中断;
    案例USI_UART_UCSTIFG:中断;
    案例USI_UART_UCTXCPTIFG:中断;
    默认值:中断;
    }
    }

    void Init_gPIO()

    P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
    P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
    P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF;P4REN = 0xFF;
    P5REN = 0xFF;P6REN = 0xFF;P7REN = 0xFF;P8REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
    P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
    }

    void UART_TXN(无符号字符*str,int大小)

    INT I = 0;
    while (大小> 0)

    UCA0TXBUF = str[I++];
    while (!(UCA0IFG和UCTXIFG));
    大小--;
    }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    您的UART数据通信层似乎没有问题(假设您已检查它)。 因此,您应该进一步检查您与SIM800 GSM模块的通信协议。 另一种方法是比较 Arduino和MSP430发送的内容。

    如果我的帖子有助于解决您的问题,请单击  验证答案    按钮 

    冬季,

    搜索 E2E! 您的问题可能已得到解答!