>

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>

숫자 6 자리, 구분자 :, 다시 ... 9 번

사용 중 :

  • 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

    번호 + '.'+ 6 float + separator = 9 자 이상을 보내고 있습니다.

    이것은 9 배 (최소 81 문자)입니다. 플러스 '<>'그리고 아마도 더 많은 문자들 ...

    그리고 32 자 길이의 버퍼에 저장합니다. 어떻게 든 그것은 내부에 모두 들어 맞지 않습니다. 왜 그런지 누가 알겠습니까? : (

    보시다시피, 당신은 전체 전송의 32 문자 만 가지고 있습니다. numChars 를 설정하십시오  100과 같은 것으로 다시 시도하십시오. 더 좋은지보십시오.

    (또한 패턴을 사용합니다

         ARD_ESP.print("<");
          Serial.print("<");
          ARD_ESP.print(totalVolume[0],6);
          Serial.print(totalVolume[0],6);
          ARD_ESP.print(":");
          Serial.print(":");
    
    

    저장된 데이터를 처리하는 데 ESP를 더 많은 시간을 두려면 지금 문제가되지 않습니다.

  • 이전 arduino - 사용자 정의 콜백 함수에 변수를 전달하는 방법
  • 다음 arduino - 어댑터가있는 arduino의 전원 LED