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:使用 TM4C123GH6PM 在 sim800模块上实现 MQTT 协议

Guru**** 2457760 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/649071/tm4c123gh6pm-implement-mqtt-protocol-on-sim800-module-with-tm4c123gh6pm

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

大家好、
我是 MQTT 协议的初学者、我想通过 SIM800 GSM/GPRS 模块通过 MQTT 协议在服务器上发布一些数据(虚拟)。 我使用的是 TM4C123GXL-Launchpad。我使用 TM4C123控制器的 UART 向 GSM 模块发送 AT 命令、并使用以下 AT 命令使用 UART 发送 Cart TCP 套接字

AT+CSTT='BSNLNET"、"、""
AT+CIICR
AT+CIFSR
AT+CIPSTART="tcp"、"iot.eclipse.org","1883"
AT+CIPSEND
插座卡纹成功。
现在、我想在 TCP/IP 上实现 MQTT 协议

这是我的代码
#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[35];
int 计数= 0;
int count1=0;
unsigned int i、j;

空 UARTTransmitCommand (char *p)

while (*p!='0')

ROM_UARTCharPut (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);


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


while (ROM_UARTCharsAvail (UART1_base))

receivechar[count]=ROM_UARTCharGet (UART1_base);
ROM_UARTCharPut (UART0_BASE、receivechar[count]);

count++;
if (计数==35)

计数= 0;

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

ROM_UARTIntClear (UART1_BASE、ui32Status);

/******** /
内部
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);

操作

UARTTransmitCommand ("at\r\n");

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


操作

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

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

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


操作

UARTTransmitCommand ("AT+CIICR\r\n");

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

操作

UARTTransmitCommand ("AT+CIFSR\r\n");

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


操作

UARTTransmitCommand ("\"AT+CIPSTART="tcp\"、\" iot.eclipse.org\",\"1883\"\r\n\0");)

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

操作

UARTTransmitCommand ("AT+CIPSEND\r\n");

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

while (1)


请帮助了解如何在 TCP/IP 上实施 MQTT  

有没有人会有一个执行相同操作或以其开头的示例代码? 欢迎提出任何建议,以更好地理解这些问题。
评估板- EKTM4C123GXL
编译器版本- TI v5.2.5
如果有人提出建议,请予以答复。
谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    此帖子中回答了类似的问题。 e2e.ti.com/.../2338921。基本上、我们不支持 MQTT。 您可以在论坛中搜索社区成员是否成功处理 MQTT 并提供相关示例、或者希望论坛中的某个人能够提供一些指导。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    这样、"重复调用"SysCtlDelay(SysCtlClockGet ());"只是为了实现延迟、这是不必要的、并且可能会"引起"问题吗?    (在此类调用期间"持续"多达-任何噪声突发/干扰都可能会造成干扰、并造成严重影响...)

    硬编码一个值-能够与"SysCtlDelay" 24位容量"匹配"-似乎是一个创建延迟的更安全的方法...

    “如此相关的帖子”到达了——如此紧密地一起——响起了报警声——难道不是吗?     建议发起者进行"学校分配"或第二次尝试-已"改变"。

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

    我想我会将其表述为

    使用 SysCtlDelay 可能会导致问题、应避免使用其他方法。 更重要的是,应记录在命令处理中使用任意延迟的情况。

    我还要指出,这里使用的命令响应处理特别脆弱。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    同意-也注意(在类别下、"特别脆弱")海报要求"完全匹配"(重置"UART-CONTRAM"计数器)。
    (海报使用"count =35"的情况下、"count >=35"的脆弱性会更小)