首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ESP8266-01不对使用TM4C123GH6PM的UART上的AT命令作出反应

ESP8266-01不对使用TM4C123GH6PM的UART上的AT命令作出反应
EN

Stack Overflow用户
提问于 2020-04-08 00:59:09
回答 1查看 89关注 0票数 0

我正试着把我的德州仪器公司的TM4C123GH6PM微控制器和我的智能手机连接起来,用它来控制闹钟和LED灯。(LED由晶体管控制,晶体管由GPIO引脚控制)。我有一些在C++和TM4C123GH6PM中编程的经验,但我还在学习很多东西。所以请原谅我可能犯的一些愚蠢的错误。

我想用串口和TivaWare框架把ESP8266和单片机连接起来。我已经写了一些代码,并且我的UART工作正常(我通过从UART4到3发送字符来测试它)。

根据ESP8266的AT命令,它应该以"OK“响应"AT”。但是,每当我向ESP发送内容时,它都会使用我发送给它的内容进行响应。我检查了线路,这不是问题所在。至少我是这么认为的。如果线路有问题,请纠正我。

代码语言:javascript
复制
ESP -> TM4C123GH6PM:
GND -> GND
VCC -> 3.3V
Tx -> Rx (UART3 / PC6)
Rx -> Tx (UART4 / PC5)
CH_PD -> 3.3V

我还检查了ESP的功耗。一切都是由我的笔记本电脑的USB端口供电的,因为这有助于减少电缆的杂乱。我使用(https://www.amazon.de/gp/product/B07C8CM5TG/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1)监控功耗。ESP从计算机中提取的电流约为150 can,但端口可以提供更多电流。我检查了一些LED,400 is不是问题。

有谁可以帮我?我已经为此工作了两天多了,但还是找不到解决方案。ESP不能正确响应AT命令有什么问题?当代码正在运行时,蓝灯是其中之一。

PS:所附代码还包含用于闹钟控制和LED的代码。我附上了它,因为它可能是问题的一部分,但其中一些被注释掉了,大部分没有被使用。

代码语言:javascript
复制
#include<stdint.h>

#include<stdbool.h>

#include"inc/hw_ints.h"

#include"inc/hw_memmap.h"

#include"inc/hw_types.h"

#include"driverlib/gpio.h"

#include"driverlib/sysctl.h"

#include"driverlib/timer.h"

#include"driverlib/interrupt.h"

#include"driverlib/uart.h"

#include"driverlib/pin_map.h"

#include "driverlib/rom.h"

// stores the time since system start in ms
uint32_t systemTime_ms;

//bools or controling the alarm clock and LEDS
bool an_aus = false;
bool alarm_clock = false;

void InterruptHandlerTimer0A (void)
{
    // Clear the timer interrupt flag to avoid calling it up again directly
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    // increase the ms counter by 1 ms
    systemTime_ms++;
}

void clockSetup(void)
{
    uint32_t timerPeriod;
    //configure clock
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ| SYSCTL_OSC_MAIN);
    //activate peripherals for the timer
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    // configure timers as 32 bit timers in periodic mode
    TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
    // set the variable timerPeriod to the number of periods to generate a timeout every ms
    timerPeriod = (SysCtlClockGet()/1000);
    // pass the variable timerPeriod to the TIMER-0-A
    TimerLoadSet(TIMER0_BASE, TIMER_A, timerPeriod-1);
    // register the InterruptHandlerTimer0A function as an interrupt service routine
    TimerIntRegister(TIMER0_BASE, TIMER_A, &(InterruptHandlerTimer0A));
    // activate the interrupt on TIMER-0-A
    IntEnable(INT_TIMER0A);
    // generate an interrupt when TIMER-0-A generates a timeout
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    // all interrupts are activated
    IntMasterEnable();
    // start the timer
    TimerEnable(TIMER0_BASE, TIMER_A);
}

void UART (void)
{
       //configure UART 4:
       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
       SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
       while(!SysCtlPeripheralReady(SYSCTL_PERIPH_UART4));

       //GPIO pins for transmitting and receiving
       GPIOPinConfigure(GPIO_PC4_U4RX);
       GPIOPinConfigure(GPIO_PC5_U4TX);
       GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);

       //configure UART 8Bit, no parity, baudrat 38400
       UARTConfigSetExpClk(UART4_BASE, SysCtlClockGet(), 38400, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));

       //configure UART 3:
       SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3);
       while(!SysCtlPeripheralReady(SYSCTL_PERIPH_UART3));
       GPIOPinConfigure(GPIO_PC6_U3RX);
       GPIOPinConfigure(GPIO_PC7_U3TX);
       GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);
       UARTConfigSetExpClk(UART3_BASE, SysCtlClockGet(), 38400, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}

void delay_ms(uint32_t waitTime)
{
    // Saves the current system time in ms
    uint32_t aktuell = systemTime_ms;
    // Wait until the current system time corresponds to the sum of the time at the start of the delay and the waiting time
    while(aktuell + waitTime > systemTime_ms);
}

void ex_int_handler(void)
{
    // press the button to start timer for alarm clock
    alarm_clock = true;
    GPIOIntClear(GPIO_PORTF_BASE,GPIO_PIN_4);
}

int main(void)
{
    //Peripherals for LED and GPIO
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    //UART
    UART();

    //Timer
    clockSetup();

    // button
    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4);
    GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);

    //OnboardLED
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_3);

    //Interrupt Timer
    GPIOIntDisable(GPIO_PORTF_BASE,GPIO_PIN_4);
    GPIOIntClear(GPIO_PORTF_BASE,GPIO_PIN_4);
    GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE);
    GPIOIntRegister(GPIO_PORTF_BASE,ex_int_handler);
    GPIOIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4);

    //Transistor Gate
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0);
    //GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_0,GPIO_STRENGTH_6MA,GPIO_PIN_TYPE_STD_WPU);

    //debugging only: save all the received data from the ESP in an array to look at while debugging
    int32_t data[20] = {0};
    int32_t j = 0;

    //Code for debugging the UART and ESP8266
while(1){

    //Checks for Data in the FIFO
    while(!UARTCharsAvail(UART4_BASE));

    //send AT-command to ESP8266
    UARTCharPut(UART4_BASE, 'A');
    while(UARTBusy(UART4_BASE));
    UARTCharPut(UART4_BASE, 'T');
    while(UARTBusy(UART4_BASE));

    if(UARTCharsAvail(UART3_BASE))
    {
        while(UARTCharsAvail(UART3_BASE))
        {
            //Read data from the FIFO in UART3 -> received from ESP8266
            data[j] = UARTCharGet(UART3_BASE);
            j++;
        }
    }

    //clear array when its full
    if (j >= 20)
    {
        j = 0;
        for(int32_t a = 0; a <21; a++)
        {
            data[a] = 0;
        }
    }
}

//code to run the alarm clock and leds
    /*
    while(1)
    {
        if (alarm_clock)
        {
            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3);
            //Wait
            delay_ms(30600000);
            GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,GPIO_PIN_0);
            alarm_clock = false;
            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,0x00);
            //Start Red LED blinking when it is finished
             while(1)
            {
                GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1);
                delay_ms(1000);
                GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0x00);
                delay_ms(1000);

            }
        }
    }
    */
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-27 02:43:07

根据ESP8266的AT命令,它应该以"OK“响应"AT”。但是,每当我向ESP发送内容时,它都会使用我发送给它的内容进行响应

带有AT命令的调制解调器通常在出厂时启用回显模式,因此当您通过串行端口手动与其交互时,它将首先回显您发送的字符,然后发送回复。

因此,当您自动化该过程时,您首先发送字符,然后等待回复,直到您到达'\r‘。好的,您正在到达'\r',但它是来自回声的那个。接下来,您可能还会有其他一些字符。你发送AT,你应该首先收到,然后你就有了OK。

要解决此问题,应关闭回显模式。关闭回显的命令是ATE0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61085334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档