홈>
Arduino Uno와 ESP8266이 있는데, ESP8266 핀 GPIO_2 (espsoftwareserial에 RX로 설정 됨)와 Uno (Software over Serial에 TX로 설정 됨)에 11을 통해 직렬로 연결되어 있습니다. 이 형식으로 데이터를 보내려고합니다 :
<0.000000 : 0.000000 : 0.000000 : 0.000000 : 0.000000 : 0.000000 : 24.50 : 24.50 : 1.49>
사용 중 :
- espsoftwareserial 라이브러리
- 원래 SoftwareSerial 라이브러리
아두 이노 UNO 코드 :
SoftwareSerial ARD_ESP(10, 11); // RX, TX
totalVolume[0] = 0.000000;
totalVolume[1] = 0.000000;
totalVolume[2] = 0.000000;
flowRate[0] = 0.000000;
flowRate[1] = 0.000000;
flowRate[2] = 0.000000;
float temperature_cold_value = 24.50;
float temperature_hot_value = 24.50;
float propane_gas_value = 1.49;
void setup()
{
ARD_ESP.begin(57600);
Serial.begin(9600);
}
void loop()
{
if (millis() - previousMillis_esp_post > 5000 && run_state_metering == 1)
{
ARD_ESP.print("<");
ARD_ESP.print(totalVolume[0],6);
ARD_ESP.print(":");
ARD_ESP.print(totalVolume[1],6);
ARD_ESP.print(":");
ARD_ESP.print(totalVolume[2],6);
ARD_ESP.print(":");
ARD_ESP.print(flowRate[0],6);
ARD_ESP.print(":");
ARD_ESP.print(flowRate[1],6);
ARD_ESP.print(":");
ARD_ESP.print(flowRate[2],6);
ARD_ESP.print(":");
ARD_ESP.print(temperature_cold_value,2);
ARD_ESP.print(":");
ARD_ESP.print(temperature_hot_value,2);
ARD_ESP.print(":");
ARD_ESP.print(propane_gas_value,2);
ARD_ESP.print(">");
Serial.print("<");
Serial.print(totalVolume[0],6);
Serial.print(":");
Serial.print(totalVolume[1],6);
Serial.print(":");
Serial.print(totalVolume[2],6);
Serial.print(":");
Serial.print(flowRate[0],6);
Serial.print(":");
Serial.print(flowRate[1],6);
Serial.print(":");
Serial.print(flowRate[2],6);
Serial.print(":");
Serial.print(temperature_cold_value,2);
Serial.print(":");
Serial.print(temperature_hot_value,2);
Serial.print(":");
Serial.print(propane_gas_value,2);
Serial.print(">");
Serial.print("");
previousMillis_esp_post = millis();
}
ESP8266 코드 : (Arduino IDE로 프로그래밍되어 있습니다)
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include <string.h>
SoftwareSerial ARD_ESP(2, SW_SERIAL_UNUSED_PIN);
const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;
String sensor_1_total_volume;
String sensor_2_total_volume;
String sensor_1_flow_rate;
String sensor_2_flow_rate;
String temperature_cold_value;
String temperature_hot_value;
String propane_butane_gas_value;
String mereni_token = "xxxxx";
void setup() {
Serial.begin(115200);
ARD_ESP.begin(57600);
delay(10);
}
void loop() {
recvWithStartEndMarkers();
showNewData();
sensor_1_total_volume = getValue(receivedChars, ':', 0);
sensor_2_total_volume = getValue(receivedChars, ':', 1);
sensor_1_flow_rate = getValue(receivedChars, ':', 2);
sensor_2_flow_rate = getValue(receivedChars, ':', 3);
temperature_cold_value = getValue(receivedChars, ':', 4);
temperature_hot_value = getValue(receivedChars, ':', 5);
propane_butane_gas_value = getValue(receivedChars, ':', 6);
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (ARD_ESP.available() > 0 && newData == false) {
rc = ARD_ESP.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
void showNewData() {
if (newData == true) {
Serial.print("This arrived: (unparsed)");
Serial.println(receivedChars);
Serial.println("DATA sensors: (parsed)");
Serial.println(sensor_1_total_volume);
Serial.println(sensor_2_total_volume);
Serial.println(sensor_1_flow_rate);
Serial.println(sensor_2_flow_rate);
Serial.println(temperature_cold_value);
Serial.println(temperature_hot_value);
Serial.println(propane_butane_gas_value);
Serial.println(mereni_token);
newData = false;
}
}
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
잘 작동하지만 ESP는 3 개의 값만 받고 다른 6은받지 않습니다. 비트 전송률을 57600으로 변경하려고 시도했지만 도움이되지 않습니다. 속도에 문제가 있거나 전체 데이터를 기다리는 중이라고 생각합니다.
나 좀 도와 줄래? 많은 감사합니다.
ESP의 결과는 다음과 같습니다.
This arrived: (unparsed)0.000000:0.000000:0.000000:0.00
DATA sensors: (parsed)
0.000000
0.000000
0.000000
0.004
xxxx
- 답변 # 1
관련 자료
- 업데이트를위한 Arduino Esp8266 LittleFS 업로드
- c# - 직렬 통신을 통해 Arduino 버튼에서 플래그를 얻는 방법은 무엇입니까?
- Arduino (ESP8266)가 모든 문자를받지 못함
- node.js - ESP8266/Arduino modbus RTU 버퍼 데이터 변환
- 두 Arduino 보드 간의 직렬 통신
- HC-05와 Arduino 연결에서 직렬 통신이 제대로 작동하지 않습니다
- c# - Wi-Fi를 통해 NodeMCU ESP8266 arduino 칩 컨트롤을 윈도우 폼 애플리케이션에 연결할 수 있습니까?
- ESP8266 듀얼 Wifi 통신
- 자율적으로 작동하는 Arduino 장치에서 원격으로 데이터 수신
- c++ - Arduino Nano 33 IoT 용 소프트웨어
- Arduino와 C # 통신 (arduino가 데이터를 계속 전송)
- c++ - 조건이있는 Arduino WiFi ESP8266 로그 데이터가 실패합니다
- Arduino 양식 Java에서 많은 바이트를 수신하는 방법
- encryption - Arduino ESP8266과 온라인 도구에서 AES 128의 결과가 다릅니다
- c++ - ESP8266을 Arduino IDE에 연결할 수 없습니다
- c# - 직렬 포트를 통한 Unity와 Arduino 직렬 통신의 문제를 해결하는 방법
- arduino - ESP8266과 함께 SoftwareSerial을 사용하는 방법
- Arduino Serial Communication 배정도 문제
- .net - C #을 사용하여 Arduino에서 직렬 패킷을받는 방법은 무엇입니까?
- Arduino Mega to ADC SPI 통신이 작동하지 않습니다
관련 질문
- arduino - 컴파일하는 동안 stdlib (strtof)에 대한 정의되지 않은 참조
- arduino - Avrdude가 특정 전송 속도로 실패
- arduino - i2c를 통해 보내기 및 받기/Arduino를 마스터 AND 슬레이브로 설정
- arduino - Arduino는 루프를 중지
- arduino - ESP8266 파란색 LED는 숙박을 유지합니다
- arduino - 추가 데이터를 보여주는 직렬 모니터
- arduino - Serialprintln ()을 사용할 때 프로그램이 충돌합니까?
- arduino - 직렬 모니터를 사용하여 릴레이 제어
- arduino - SoftwareSerial을 사용하여 두 보드간에 데이터 전송
번호 + '.'+ 6 float + separator = 9 자 이상을 보내고 있습니다.
이것은 9 배 (최소 81 문자)입니다. 플러스 '<>'그리고 아마도 더 많은 문자들 ...
그리고 32 자 길이의 버퍼에 저장합니다. 어떻게 든 그것은 내부에 모두 들어 맞지 않습니다. 왜 그런지 누가 알겠습니까? : (
보시다시피, 당신은 전체 전송의 32 문자 만 가지고 있습니다.numChars
를 설정하십시오 100과 같은 것으로 다시 시도하십시오. 더 좋은지보십시오.(또한 패턴을 사용합니다
저장된 데이터를 처리하는 데 ESP를 더 많은 시간을 두려면 지금 문제가되지 않습니다.