C ESP8266-UART的缓冲区存储容量
我在将字符串的值从UART传输到缓冲区时遇到问题。我使用ESP8266从STM32设备接收串行字符串。我总共有600个字符串,还有从STM32设备传输的CSV文件。我对NodeMCU端的每一行都使用了适当的过滤。。。我不知道为什么在300字符串之后,传输到缓冲区的值会发生变化,UART上读取的字符串也会在传输300/305字符串之后发生变化。如果密码有错误,请告诉我C ESP8266-UART的缓冲区存储容量,c,esp8266,uart,nodemcu,C,Esp8266,Uart,Nodemcu,我在将字符串的值从UART传输到缓冲区时遇到问题。我使用ESP8266从STM32设备接收串行字符串。我总共有600个字符串,还有从STM32设备传输的CSV文件。我对NodeMCU端的每一行都使用了适当的过滤。。。我不知道为什么在300字符串之后,传输到缓冲区的值会发生变化,UART上读取的字符串也会在传输300/305字符串之后发生变化。如果密码有错误,请告诉我 int i,j,k,l=0; int httpCode=0; String fields[24] = {""
int i,j,k,l=0;
int httpCode=0;
String fields[24] = {"","month","year","hours","minutes","seconds","rimin","riavg","rimax","yimin","yiavg","yimax","bimin","biavg","bimax","nimin","niavg","nimax","eimin","eiavg","eimax","simin","siavg","simax"};
String element = "API_key=123&mac=0fa&day=";
String postApi1[300];
String postApi2[300];
String str= "";
String str_tx = "";
char char_array[128];
char* token;
char* rest = char_array;
WiFiClient client;
HTTPClient http;
void setup()
{
Serial.begin(230400);
s.begin(9600);
pinMode(13, INPUT);
pinMode(15, OUTPUT);
}
void loop()
{
if (s.available() >0)
{
for(j=0;j<300;j++)
{
i=0;
str = s.readStringUntil('\n');
Serial.println(str);
Serial.println("j");
postApi1[j]= str;
Serial.println(postApi1[j]);
str = "";
}
for(k=0;k<300;k++)
{
i=0;
str = s.readStringUntil('\n');
Serial.println(str);
Serial.println("k");
postApi2[k]= str;
Serial.println(postApi2[k]);
str = "";
}
}
}
inti,j,k,l=0;
int-httpCode=0;
字符串字段[24]={“,”月“,”年“,”小时“,”分“,”秒“,”rimin“,”riavg“,”rimax“,”yimin“,”yiavg“,”yimax“,”bimin“,”biavg“,”bimax“,”nimin“,”niavg“,”nimax“,”eimin“,”eiavg“,”eimax“,”simin“;
String element=“API_key=123&mac=0fa&day=”;
字符串postApi1[300];
字符串postApi2[300];
字符串str=“”;
字符串str_tx=“”;
字符数组[128];
字符*令牌;
char*rest=char\u数组;
无线客户端;
HTTPClient-http;
无效设置()
{
序列号开始(230400);
s、 开始(9600);
pinMode(13,输入);
pinMode(15,输出);
}
void循环()
{
如果(s.可用()>0)
{
对于(j=0;j我认为readStringUtil函数等待终止符字符。是否在第300个字符之后发送“\n”?另外,请尝试在read函数中避免Serial.println,因为print函数非常慢,您可能会错过一些字符。我还将避免两个for循环,而是声明一个变量,计算接收的字节数根据这一点,将“str”保存为“postApi1”或“postApi2”。
还有,“i”变量的用途是什么?嘿@Andrej我试过你的建议,但效果如下
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <SoftwareSerial.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <stdio.h>
#include <string.h>
using namespace std;
ESP8266WiFiMulti WiFiMulti;
SoftwareSerial s(13,15); //RX TX
double buff[24]; //Initialized variable to store recieved data
double val;
char c;
int i,j,k,l=0;
int httpCode=0;
String fields[24] = {"","month","year","hours","minutes","seconds","rimin","riavg","rimax","yimin","yiavg","yimax","bimin","biavg","bimax","nimin","niavg","nimax","eimin","eiavg","eimax","simin","siavg","simax"};
String element = "API_key=123&mac=0fa&day=";
String postApi[616];
String str= "";
String str_tx = "";
char char_array[128];
char* token;
char* rest = char_array;
WiFiClient client;
HTTPClient http;
void setup()
{
Serial.begin(230400);
s.begin(9600);
pinMode(13, INPUT);
pinMode(15, OUTPUT);
//Serial.setDebugOutput(true);
//ESP.wdtDisable();
//Serial.begin(115200);
// Serial.setDebugOutput(true);
Serial.println();
Serial.println();
Serial.println();
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("ECLP", "p@@$w0rD");
if ((WiFiMulti.run() == WL_CONNECTED))
{
Serial.print("WIFI connected");
}
}
void loop()
{
if (s.available() >0)
{
for(j=0;j<616;j++)
{
i++;
str = s.readStringUntil('\n');
//Serial.println(str);
//Serial.println(j);
postApi[j]= str;
//Serial.println(postApi[j]);
str = "";
}
}
if(i == 616)
{
i=0;
for(k=0;k<616;k++)
{
Serial.println(k);
Serial.print(" : ");
Serial.print(postApi[k]);
}
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
ESP8266WiFiMulti WiFiMulti;
串行软件(13,15);//RX-TX
double buff[24];//初始化变量以存储接收到的数据
双val;
字符c;
int i,j,k,l=0;
int-httpCode=0;
字符串字段[24]={“,”月“,”年“,”小时“,”分“,”秒“,”rimin“,”riavg“,”rimax“,”yimin“,”yiavg“,”yimax“,”bimin“,”biavg“,”bimax“,”nimin“,”niavg“,”nimax“,”eimin“,”eiavg“,”eimax“,”simin“;
String element=“API_key=123&mac=0fa&day=”;
字符串postApi[616];
字符串str=“”;
字符串str_tx=“”;
字符数组[128];
字符*令牌;
char*rest=char\u数组;
无线客户端;
HTTPClient-http;
无效设置()
{
序列号开始(230400);
s、 开始(9600);
pinMode(13,输入);
pinMode(15,输出);
//Serial.setDebugOutput(true);
//尤其是wdtDisable();
//序列号开始(115200);
//Serial.setDebugOutput(true);
Serial.println();
Serial.println();
Serial.println();
对于(uint8_t=4;t>0;t--){
Serial.printf(“[设置]等待%d..\n”,t);
Serial.flush();
延迟(1000);
}
WiFi.模式(WiFi_STA);
WiFiMulti.addAP(“ECLP”,“p@@@w0rD”);
如果((WiFiMulti.run()==WL_已连接))
{
串行打印(“WIFI连接”);
}
}
void循环()
{
如果(s.可用()>0)
{
对于(j=0;j请将足够多的链接样本直接放在您的帖子中,以说明您想要传达的内容,不要将其留在链接中。大多数人都不会费心/想点击链接。此代码是否使用cs50
?我问这个问题是因为String
C type
,但是cs50中有一个typedefe> 您使用的是什么流量控制?串行要求发送方和接收方的流量控制匹配您似乎在使用Arduino库(您应该指出这一点),您还应该提供有关设备的信息(esp8266不能单独工作,设备配置很重要)。此外,您还应该提供一些示例输入数据(您的输入字符串)是的,我使用arduino编译器编写代码,我的输入字符串是CSV文件中的一行,如串行输出监视器所示。我使用的设备是Nodemcui,它是我之前使用的变量,但忘记了注释它。我没有任何问题,无法将所有读取的字符串存储到单个postApi缓冲区中,但它在300秒后给出相同的输出铃声不是字符。“\n”在每次读取字符串后都会发送。感谢您的回复。我将尝试用编辑过的代码进行回复,并将串行输出转发给您。请不要在问题中添加内容作为答案。这不是StackOverflow的工作方式。请阅读“!谢谢@thebusybee指出这一点,我将在下次发布我的查询时处理这一问题。