C 通过usart使用stm32F103向esp8266发送AT命令

C 通过usart使用stm32F103向esp8266发送AT命令,c,esp8266,at-command,keil,stm32f1,C,Esp8266,At Command,Keil,Stm32f1,我试图在keil IDE上使用STM32F103与Wifi模块(esp8266)通信。 如示意图所述: 我想让我的stm32通过usart1(Tx1)向esp8266发送AT命令,并获得esp响应(Rx1),然后使用usart2(Tx2)在计算机串行监视器上显示esp响应 在配置了usart1和usart2,并编写了发送接收数据的函数之后,我只得到了命令的回音,而不是应该是“OK”的响应,在这里输入code。 当我发送“AT\r\n”时,我只在串行监视器上接收AT。 我将分享我写的代码,以及逻辑

我试图在keil IDE上使用STM32F103与Wifi模块(esp8266)通信。 如示意图所述: 我想让我的stm32通过usart1(Tx1)向esp8266发送AT命令,并获得esp响应(Rx1),然后使用usart2(Tx2)在计算机串行监视器上显示esp响应

在配置了usart1和usart2,并编写了发送接收数据的函数之后,我只得到了命令的回音,而不是应该是“OK”
的响应,在这里输入code
。 当我发送“AT\r\n”时,我只在串行监视器上接收AT。 我将分享我写的代码,以及逻辑分析器上的跟踪。 如果有任何建议,我将不胜感激

 int len=0;
char buff[256];

int main(void){
    
     __disable_irq();
    
    
    systick_init();
  UART1_Init();
    UART2_Init();

  Delayms(100);
    
printMsg1("AT\r\n");
    
    Delayms(100);
    
    NVIC_EnableIRQ(USART1_IRQn);
    
    __enable_irq();
    
while(1){}

}


void USART1_IRQHandler(){

if (USART1->SR & USART_SR_RXNE) // if received data (RXNE event flag is set) is ready to be read -->RXNE
            {
    
             buff[len] = USART1->DR;
                            
                Delayms(100);
                
                printMsg2(buff);

    }
                
}

void printMsg1(char *msg, ...)  // Sending AT command to ESP  ( Stm32-> ESP8266)
{

 va_list args;
 va_start(args,msg); 
 vsprintf(buff,msg,args);
 
 for(int i=0;i<strlen(buff);i++)
 {


   USART1->DR = (buff[i]&0xFF);
     while(!(USART1->SR & USART_SR_TXE)); //wait for TXE, 1 = data transferred
   
  }
}

void printMsg2(char *msg, ...)  // Sending ESP response to Serial Monitor ( STM32-> PC)
{

 va_list args;
 va_start(args,msg); 
 vsprintf(buff,msg,args);
 
 for(int i=0;i<strlen(buff);i++)
 {
   USART2->DR = buff[i];
   while(!(USART2->SR & USART_SR_TXE)); //wait for TXE, 1 = data transferred
  }
}
int len=0;
字符buff[256];
内部主(空){
__禁用_irq();
systick_init();
UART1_Init();
UART2_Init();
Delayms(100);
printMsg1(“AT\r\n”);
Delayms(100);
NVIC_EnableIRQ(USART1_IRQn);
__启用_irq();
而(1){}
}
void USART1_IRQHandler(){
if(USART1->SR&USART\U SR\U RXNE)//如果接收到的数据(设置了RXNE事件标志)已准备好读取-->RXNE
{
buff[len]=USART1->DR;
Delayms(100);
printMsg2(buff);
}
}
void printMsg1(char*msg,…)//向ESP发送AT命令(Stm32->ESP8266)
{
va_列表参数;
va_启动(args,msg);
vsprintf(buff、msg、args);
for(inti=0;iDR=(buff[i]&0xFF);
while(!(USART1->SR&USART_SR_TXE));//等待TXE,1=传输的数据
}
}
void printMsg2(char*msg,…)//向串行监视器发送ESP响应(STM32->PC)
{
va_列表参数;
va_启动(args,msg);
vsprintf(buff、msg、args);
对于(int i=0;iDR=buff[i];
while(!(USART2->SR&USART_SR_TXE));//等待TXE,1=传输的数据
}
}


如果您只在\r发送
,那会怎么样?我的意思是,如果没有尾随的
\n
我在\r,stm32似乎在响应我发送的内容!!哦,我明白了。您使用相同的
buff
来放置从usart1收到的数据,这就是为什么您只打印您试图发送到调制解调器的内容。此外,您应该增加ement
len
每次您在isr中获得一个字符,并发送回len字符(vsnprintf需要以null结尾的字符串)都是很好的建议!我将调整我的代码,看看会发生什么。谢谢您说得对!它现在可以工作了。相同的缓冲区用于发送AT命令和接收响应“buff[len]”,它将接收数据也放在buff[len]中,并且似乎被忽略,这就是我接收命令echo的原因。此外,事实证明,“Delayms”函数已损坏或导致接收数据丢失,这可能是由于长时间等待导致数据丢失。谢谢!!