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.

[参考译文] MSP430G2553:TD1208 Sigfox模块:我无法获得对AT命令的响应

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/630538/msp430g2553-td1208-sigfox-module-i-can-not-get-the-response-to-the-at-commands

部件号:MSP430G2553

您好,
我有一个通过UART将AT命令发送到sigfox模块TD1208的代码,它工作正常(或者我想是这样)。 我重新获取了代码以将其集成到更复杂的程序中,但在测试之前,它无法正常工作。 向TD1208模块发送AT命令是正确的,它会正确执行这些命令。 问题是我需要查看模块响应,但我没有收到,'USGI0RX_ISR'从未执行。 我用launchpad进行测试,RX和TX引脚转90º。 我附上了代码。 提前感谢。

#include <msp430g2553.h>
#include "string.h"

#define STRSIGFOXLENGHT 350

#define LED BIT0
#define RXD BITS1
#define TXD BIX2

volatile unsigned int txFlag; // txFlag的邮箱标志。
volatile unsigned char txChar; //此字符是进入UART

volatile unsigned int rxFlag的最新字符; // rxFlag的邮箱标志。
volatile unsigned char rxChar; //此char是UART

字符strSigfox[STRSIGFOXLENGHT],

void uartInit(void),
unsigned char uartReadChar(),
void uartWriteChar(unsigned char c),
void uartReadString(char* Array, int length, char* pattern, int patternLength);
void uartWriteString(car *str);


int main(void){

WDTCTL = WDTPW + WDTHOLD; //停止WDT
BCSCTL1 = CALC1_1MHz; //将DCO设置为1MHz
DCOCTL = CALDCO_1MHz; //将DCO设置为1MHz

uartInit(); //初始化UART连接

__enable_interrupit(); //已启用中断

Memset (strSigfox,'\0',STRSIGFOXLENGHT);
//uartWriteString (((char *)"at$SS=4.0628万f5c427ee148\n\n");
uartWriteString ((char *)"at\n\r");
uartReadString (strSigfox,STRSIGFOXLENGHT,(char *)"确定",2);
uartWriteString ((char *)"\n\r\n\r\n\r");
uartWriteString(strSigfox);

}


void uartInit(void){

P1SEL = RXD + TXD; //设置I/O
P1SEL2 = RXD + TXD;

P1DIR || LED; //WFP 1.0 红色LED。 在收到CHAR时切换。
P1OUT &=~LED; //LED熄灭

UCA0CTL1 || UCSSEL_2;

UCA0BR0 = 104;
UCA0BR1 = 0;
UCA0MCTL = 0x10|UCBRS0;
UCA0CTL1 &=~UCSWRST; //USCI状态机
IE2 |= UCA0RXIE; //启用USI_A0 RX中断

rxFlag =0; //将rxFlag设置为0
txFlag =0; //将txFlag设置为0

return;
}

unsigned char uartReadChar() //等待UART
{
IE2 |= UCA0RXIE;
while (rxFlag == 0); //等待设置Rx_flag
rxFlag =0; //ACK Rx_flag
返回rxChar;
}

void uartReadString(Char* Array, int length,char* pattern,int patternLength)
{
无符号int i =0;
while ((i < length))(((I <长度) //抓取数据,直到数组填充
{
array[i]= uartReadChar();

IF (模式长度>=1){

IF((Array[i]== pattern[1])&&(Array[i-1]== pattern[0])) //如果我们收到一个\r主机要结束
{
I++;
for (; i < length ; i++)(对于(; i <长度; i++)) //用\0 nul填充字符串的其余部分。 用\0覆盖\r
{
array[i]='\0';
}
中断;
}
I++;
}

return;
}

void uartWriteChar(unsigned char c)
{
txChar = c; //将char放入TX_char中
IE2 |= UCA0TXIE; //启用USI_A0 TX中断
while (txFlag == 1); //必须等待TX缓冲区
txFlag =1; //重置TX_FLAG
return;
}


void uartWriteString(car *str) //向UART发送字符串。
{
while (* str) uartWriteChar(*str++); //通过字符串前进到结尾
return;
}

#pragma vector = USCIAB0TX_vector //UART TX USCI中断
__interrupt void USCI0TX_ISR(void){

UCA0TXBUF = txChar; //将字符复制到TX缓冲区
txFlag =0; //ACK TX_FLAG
IE2 &=~UCA0TXIE; //关闭中断以保存CPU
}

#pragma vector = USCIAB0RX_vector //UART RX USCI中断。 这在USCI收到CHAR时触发。
__interrupt void USCI0RX_ISR(void)
{
rxChar = UCA0RXBUF; //从RX缓冲区复制,在执行此操作时,我们也确认中断
rxFlag =1; //将Rx_flag设置为1
IE2 &=~UCA0TXIE;
P1OUT ^= LED; //通过切换LED
来通知我们收到了字符}

此致,
Fran Martín ć。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何知道Rx ISR未执行? 调试器断点是一个可靠的指示器。 但是,如果您依赖LED,请记住,偶数个Rx字符("at\r\nOK\r\n")将使LED熄灭,并且闪烁速度太快,看不到。

    主动提供:
    1)如果输入行与模式不匹配,uartReadString将挂起。
    2)您的代码是半双工代码,只有一个或两个字节(rxChar + UCA0RXBUF)的缓冲。 TD1208 AT回波默认为打开,因此在您传输时会发送给您。 UART保留最新数据,因此您可能只能使用"K\r\n"或"\n"。 您可能希望使用此处的循环缓冲区在后台收集Rx数据。
    3) 512字节设备中350字节的消息缓冲区相当大。 只要你意识到这一点,我就听从你的判断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢Bruce。

    您如何知道Rx ISR未执行? 调试器断点是一个可靠的指示器。 但是,如果您依赖LED,请记住,偶数个Rx字符("at\r\nOK\r\n")将使LED熄灭,并且闪烁速度太快,看不到。

    [/引述]

    是的,我使用的是断点。 您对LED的选择是正确的,如果它通过ISR,我应该简单地将其戴上。

    [报价用户="Bruce McKenney4.7378万"]
    主动提供:
    1)如果输入行与模式不匹配,uartReadString将挂起。

    [/引述]

    我曾想用计时器来解决这个问题,对吗?

    [报价用户="Bruce McKenney4.7378万"]
    2)您的代码是半双工代码,只有一个或两个字节(rxChar + UCA0RXBUF)的缓冲。 TD1208 AT回波默认为打开,因此在您传输时会发送给您。 UART保留最新数据,因此您可能只能使用"K\r\n"或"\n"。 您可能希望使用此处的循环缓冲区在后台收集Rx数据。
    [/引述]

    我几乎没有编程经验,开发循环缓冲器对我来说很复杂。 现在我使用它来检测模式'OK'

    [报价用户="Bruce McKenney4.7378万"]
    3) 512字节设备中350字节的消息缓冲区相当大。 只要你意识到这一点,我就听从你的判断。

    [/引述]

    是的,它非常大。 我这样做是因为我想看到命令'at?'的完整响应。 这只是一次测试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否将调制解调器直接连接到Launchpad针脚? 如果是,则不应安装J3 TXD/RXD跳线。

    我没有您的设备,但我用PuTTY弄了一些东西,没有发现明显的问题--如果我键入“OK”,我会返回<<<。

    我不能做的一件事是全双工,并且:

    [>rxFlag =1; //将rx_flag设置为1]
    > IE2 &=~UCA0TXIE;

    我建议您删除清除TXIE的第二行。 这将设置Tx端的比赛,这可能导致其在uartWriteChar中挂起。 这大概还没有发生,但最终会发生。