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.

[参考译文] TM4C123GH6PM:使用 AT 命令连接 GSM 调制解调器时出现问题

Guru**** 2457760 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/648586/tm4c123gh6pm-problem-interfacing-with-gsm-modem-with-at-command

器件型号:TM4C123GH6PM

我想将 GSM SIM800模块与 Tiva c 系列协调器相连接。

和要使用 TM4C.I 的 UART 向 GSM 模块发送 AT 命令、我希望使用 SIM800和 AT 命令通过 GPRS 发布 MQTT 数据

如果我发送
"在\r\n 时"我接收回

"在"

好的
"\\"AT+CSTT="BSNLNET\"\n\n\0"我接收回

"AT+CSTT="BSNLNE 预期

AT+CSTT="BSNLNET"    

好的

这是我的代码

#include
#include
#include
//#include "inc/tm4c123ghp6.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/uart.h"

char ok[]="OK\r\n";

char receivechar[50];
int 计数= 0;
int count1=0;
unsigned int i、j;

空 UARTTransmitCommand (char *p)

while (*p!='0')

ROM_UARTCharPutNonBlocking (UART1_base、* p);
P++;

ROM_IntEnable (INT_UART1);


//驱动程序库遇到错误时调用的错误例程。
//
//
#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)


#endif

//

// UART 中断处理程序。
/********* /
无效
UART1 IntHandler (空)

uint32_t ui32Status;
++国家1;

//
//获取中断状态。
//
ui32Status = ROM_UARTIntStatus (UART1_base、true);

//
//清除已发出的中断。

ROM_UARTIntClear (UART1_BASE、ui32Status);


//在接收 FIFO 中有字符时循环。
//


while (ROM_UARTCharsAvail (UART1_base))

receivechar[count]=ROM_UARTCharGetNonBlocking (UART1_base);
ROM_UARTCharPutNonBlocking (UART0_BASE、receivechar[count]);

count++;
if (count = 50);
计数= 0;

ROM_IntDisable (INT_UART1);

/******** /
内部
main (空)

//
//为中断处理程序启用怠惰堆栈。 这允许使用浮点
/////要在中断处理程序中使用的指令,但代价是
//额外的堆栈用法。
//
ROM_FPUEnable();
ROM_FPULazyStackingEnable();

//
//将时钟设置为直接从晶体运行。
//
ROM_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);


//
//启用此示例使用的外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

//
//启用处理器中断。
//
ROM_IntMasterEnable();

//
//将 GPIO B0和 B1设置为 UART 引脚。
//
GPIOPinConfigure (GPIO_PB0_U1RX);
GPIOPinConfigure (GPIO_PB1_U1TX);

GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);


ROM_GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);


//
//将 UART 配置为115、200、8-N-1操作。
//
ROM_UARTConfigSetExpClk (UART1_base、ROM_SysCtlClockGet ()、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

ROM_UARTConfigSetExpClk (UART0_BASE、ROM_SysCtlClockGet ()、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

//
//启用 UART 中断。

ROM_UARTIntEnable (UART1_base、UART_INT_RX | UART_INT_RT);

ROM_UARTFIFOEnable (UART1_BASE);

UARTFIFOLevelSet (UART1_base、UART_FIFO_TX1_8、UART_FIFO_RX1_8);


ROM_UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);

ROM_UARTFIFOEnable (UART0_BASE);

UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);

UARTEnable (UART0_BASE);
UARTEnable (UART1_BASE);

while (1)

操作

UARTTransmitCommand ("at\r\n");

SysCtlDelay (SysCtlClockGet ());
SysCtlDelay (SysCtlClockGet ());
SysCtlDelay (SysCtlClockGet ());
中断;
}while ((strcmp (ok、receivechar))!=0);


操作

UARTTransmitCommand ("\"AT+CSTT="BSNLNET\"n\r\n\r\n");

SysCtlDelay (SysCtlClockGet ());
SysCtlDelay (SysCtlClockGet ());
SysCtlDelay (SysCtlClockGet ());


中断;
}while ((strcmp (ok、receivechar))!=0);

我得到如下输出


请帮我提供任何建议。

在高级版中感谢..........

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

    您是否注意到您的"多余字符"(位于)在传输中恰好出现了"17个 UART 计数"?
    为什么"你"认为这是?   MCU UART 的哪一部分被证明对字符(17个字符及以上)"敏感"?

    您的主题行-这确实是"相当好"-"以"命令"为目标、作为您的问题原因。     然而- AT Command 可能是"无"的-而" UART 数据的长度"是(真实)原因吗?     不要"匆忙"进行诊断-需要更深入的思考...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1为您提供了一个很好的提示、但由于时区差异和即将到来的周末、我将更加具体。 (抱歉、CB1、我可能会破坏您创建的可拆卸时刻。)

    如果在 UARTTransmitCommand()中使用函数 UARTCharPutNonBlocking()而不检查返回值,则表示未传输某些字符。 "非阻塞"意味着如果 FIFO 中没有空间、例程不会等待。 相反、它返回"false"、让您知道它还不能加载另一个字符。 使用 UARTCharPUT()是一种可能的替代方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Bob、

    它"确实出现"、就像、
    教学时刻----;

    已到达。 我们都希望海报能"扩展他的探测和调查"(真的)掌握 UART 功能之间的差异-(仔细"记录他的调查结果")、从而扩展他在这个过程中的能力和信心。 (您和/或其他有能力的供应商员工"并非总是"来提供此类"救援"。) 因此、我通过重点实验来推动"自助"-在 kiss 下(始终)、每次一小步...