اطلاعیه

Collapse
No announcement yet.

مشکل با تبادل سریال بین آردینو و بسکام

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با تبادل سریال بین آردینو و بسکام

    سلام به همه
    داستان اینه:
    من توی یه پروژه ماژول esp8266 رو با کتابخانه و برنامه تحت کامپایلر آردینو راه اندازی کردم، توی قسمتی از کد باید مقادیر سه تا adc رو با یه سری پردازش های دیگه توسط یه چیپ atmega8 که با بسکام نوشتم رو بخونم (چون به بسکام مسلطم) و در ازای یک کاراکتر درخواستی از سمت esp8266 مقادیر رو برگردونم... (یک بایت داده که حاوی مقادیر محاسبه شده از adc ها که برای برنامه آردینو روی esp8266 ارسال میشه)
    کاری که داره اتفاق میفته یک خط فرمان مثل AT Command هست
    از esp8266 دو کاراکتر برای بسکام ارسال میکنم و با موفقیت هم پیام رو دریافت میکنم
    در پاسخ به کاراکتر مقدار رو از طریق دستور print که فقط 1 بایت هست برای برنامه آردینو روی ماژول esp8266 میفرستم
    اما مشکل همینجا پیش میاد...
    در هر دریافت چرت و پرت میخونه!! یک بار مقدار درسته... 1000 بار دیگه یا مقدار های دریافتی رو به اشتباه برای درخواست های دیگه میگیره یا اصلا نمیگیره! یا کلا یه چیز دیگه میگیره...!!
    برای دریافت مقادیر با دستور Serial.read() و Serial.parseInt() امتحان کردم... ولی نشد!
    من احتمال میدم مشکل همینجا باشه برای همین جهت اطمینان از عدم دریافت خطا این روال رو پیاده کردم:
    1- در زمان نیاز به گرفتن مقادیر یه تابع خارج از حلقه اصلی برنامه صدا زده میشه
    2- دو کاراکتر به سمت برنامه بسکام از طریق پورت سریال ارسال میشه
    3- برنامه از طریق شرط while(!Serial.avaiable()); در انتظار دریافت داده میمونه
    4- بعد از دریافت و نقض شرط بالا به خط بعدی میره که مقدار دریافتی توسط دستور serial.parseInt() به داخل یک متغیر از جنس int میریزه
    5- یک بار هم مقدار رو به یک متغیر دیگه اختصاص میدم تا بعدا ازش استفاده کنم

    یه چند مورد هست که بهش مشکوکم... میگم که دوستان بتونن بهتر کمکم کنن:
    - ممکنه به علت ارسال شدن تنها یک بایت از سمت برنامه بسکام مشکل به وجود اومده باشه
    - ممکنه بافر دریافت اطلاعات خالی نشده یا به هر علتی که هست مقدار رو صحیح نمیگیره
    - ممکنه شرط انتظاری که گذاشتم درست عمل نمیکنه
    - ممکنه طریق خوندن مقدار از پورت رو درست پیاده نکردم (با توجه به اینکه من فقط یک بایت داده میخوام بگیرم)

    در ادامه سورس برنامه سمت esp رو میذارم:(چون قسمت های زیادی از برنامه مربوط به رندر وب سرور هست، از طرفی شاید مشکل جای دیگه از برنامه ام باشه، همه سورس رو آوردم ولی دو تابع آخر کار دریافت اطلاعات رو انجام میدن)

    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <DNSServer.h>
    #include <ESP8266WebServer.h>
    #include <WiFiManager.h>

    WiFiServer server(80);
    int key1 = LOW;
    int key2 = LOW;
    int key3 = LOW;
    int key4 = LOW;
    int light = 0;
    int hr = 0;
    int termo = 0;
    byte tempget = 0;

    void setup() {
    Serial.begin(115200);
    delay(10);
    WiFiManager wifiManager;
    wifiManager.autoConnect("My WiFi");

    server.begin();
    delay(2000);
    Serial.println("TE");
    Serial.println("ST");
    }


    //MAIN RENDER
    void loop() {

    // Check if a client has connected
    WiFiClient client = server.available();
    if (!client) {
    return;
    }

    requst();

    // Wait until the client sends some data
    ////Serial.println("new client");
    while (!client.available()) {
    delay(1);
    }

    // Read the first line of the request
    String request = client.readStringUntil('\r');
    ////Serial.println(request);
    client.flush();

    // Match the request
    if (request.indexOf("/k1=on") != -1) {
    Serial.println("N1");
    key1 = HIGH;
    }
    else if (request.indexOf("/k1=off") != -1) {
    Serial.println("F1");
    key1 = LOW;
    }
    else if (request.indexOf("/k2=on") != -1) {
    Serial.println("N2");
    key2 = HIGH;
    }
    else if (request.indexOf("/k2=off") != -1) {
    Serial.println("F2");
    key2 = LOW;
    }
    else if (request.indexOf("/k3=on") != -1) {
    Serial.println("N3");
    key3 = HIGH;
    }
    else if (request.indexOf("/k3=off") != -1) {
    Serial.println("F3");
    key3 = LOW;
    }
    else if (request.indexOf("/k4=on") != -1) {
    Serial.println("N4");
    key4 = HIGH;
    }
    else if (request.indexOf("/k4=off") != -1) {
    Serial.println("F4");
    key4 = LOW;
    }

    // Return the response
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println(""); // do not forget this one
    client.println("<html>");
    client.println("<a href=\"/k1=on\"><button>ON</button></a> | <a href=\"/k1=off\"><button>OFF</button></a> | Key1 = ");
    if (key1 == HIGH) {
    client.println("ON");
    } else {
    client.println("OFF");
    }
    client.println("<br>-----------<br><a href=\"/k2=on\"><button>ON</button></a> | <a href=\"/k2=off\"><button>OFF</button></a> | Key2 = ");
    if (key2 == HIGH) {
    client.println("ON");
    } else {
    client.println("OFF");
    }
    client.println("<br>-----------<br><a href=\"/k3=on\"><button>ON</button></a> | <a href=\"/k3=off\"><button>OFF</button></a> | Key3 = ");
    if (key3 == HIGH) {
    client.println("ON");
    } else {
    client.println("OFF");
    }
    client.println("<br>-----------<br><a href=\"/k4=on\"><button>ON</button></a> | <a href=\"/k4=off\"><button>OFF</button></a> | Key4 = ");
    if (key4 == HIGH) {
    client.println("ON");
    } else {
    client.println("OFF");
    }
    client.println("<br>-----------<br> Light Level = ");
    client.print(light);
    client.println("%");
    client.println(" | Temp Level = ");
    client.print(termo);
    client.println("C");
    client.println(" | HR Level = ");
    client.print(hr);
    client.println("%");
    client.println("</html>");
    delay(1);

    }

    void requst(){
    getdata("LL");
    delay(500);
    getdata("TP");
    delay(500);
    getdata("HR");
    delay(500);
    return;
    }

    void getdata(String x) {
    Serial.println(x);
    while (!Serial.available()){delay(1);}
    tempget = Serial.parseInt();
    if (x == "LL") {
    light = (int)tempget;
    }
    if (x == "TP") {
    termo = (int)tempget;
    }
    if (x == "HR") {
    hr = (int)tempget;
    }
    return;
    }


لطفا صبر کنید...
X