несколько открытых SoftwareSerial портов

Тема в разделе "Arduino & Shields", создана пользователем Илья Савицкий, 28 мар 2018.

  1. Писал тут я gps-трекер, который отсылал бы данные на сервер посредство GET-запроса на сервер:
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    #include <TroykaGPS.h>
    #include <SoftwareSerial.h>
    #define IMEI "861508038977104"
    #define INTERVAL 60000
    #define LEN 370
    char time[16];
    char date[16];
    char tcpBuffer[370];
    char buf[16];//time buffer
    unsigned long previousMillis = 0;


    SoftwareSerial gprsStream(10, 11);
    SoftwareSerial gpsStream(4, 5);
    GPS gps(gpsStream);
    GPRS gprs(gprsStream);


    void setup(){
        Serial.begin(9600);
        while(!Serial){}
        Serial.println("Serial opened on 9600");
        delay(100);
        gpsStream.begin(115200);
        Serial.println("gpsStream opened on 115200");
        gpsStream.write("$PMTK251,9600*17\r\n");
        Serial.println("gpsStream changed to 9600");
        gpsStream.end();
        Serial.println("gpsStream closed");
    }

    void loop(){
        gprsStream.begin(9600);
        Serial.println("gprsStream opened on 9600");
        gprs.powerOn();
        gprs.getDateTime(buf);
        Serial.print("time on gprs: ");
        Serial.println(buf);
        gprs.powerOff();
        gprsStream.end();
        Serial.println("gprsSerial closed");
        gpsStream.begin(9600);
        Serial.println("gpsStream opened on 9600");
        if(gps.available()){
            gps.readParsing();
            switch(gps.getState()){
            case GPS_OK:
                gps.getTime(time, 16);
                gps.getDate(date, 16);
                sprintf(tcpBuffer, "GET /recvdata.php?%s_%s.txt&data=%s_%s_%s_%f_%f HTTP/1.0\r\n\r\n", date, time, IMEI, date, time, gps.getLatitudeBase10(), gps.getLongitudeBase10());
                Serial.print("formed: ");
                Serial.print(tcpBuffer);
                break;
            case GPS_ERROR_DATA:
                sprintf(tcpBuffer, "GET /recvdata.php?filename=%s_err.txt&data=ERROR_DATA_%s_%s HTTP/1.0\r\n\r\n", buf, buf, IMEI);
                Serial.print("formed: ");
                Serial.println(tcpBuffer);
                break;
            case GPS_ERROR_SAT:
                sprintf(tcpBuffer, "GET /recvdata.php?filename=%s_err.txt&data=ERROR_SAT_%s_%s HTTP/1.0\r\n\r\n", buf, buf, IMEI);
                Serial.print("formed: ");
                Serial.println(tcpBuffer);
                break;
            }
        }
        else{
            Serial.println("GPS not available");
            return;
        }
        gpsStream.end();
        Serial.println("gpsStream closed");
        gprsStream.begin(9600);
        Serial.println("gprsStream opened on 9600");
        gprs.powerOn();
        while(!gprs.init()){
            Serial.println("GPRS init error");
            delay(500);
        }
        Serial.println("GPRS init success");
        delay(3000);
        while(!gprs.join("internet.beeline.ru", "beeline", "beeline")){
            Serial.println("GPRS error joining network");
            delay(1000);
        }
        Serial.println("GPRS connected to the network");
        Serial.print("IP address is ");
        Serial.println(gprs.getIPAddress());
        while(!gprs.connect(TCP, "188.44.53.81", 80)){
            Serial.println("GPRS could not connect to the internet");
            delay(1000);
        }
        Serial.println("GPRS connected to the internet");
        gprs.send(tcpBuffer);
        clearTcpBuffer();
        gprs.close();
        gprs.disconnect();
        delay(100);
        Serial.println("Buffer sent");
        gprs.powerOff();
        gprsStream.end();
        Serial.println("gprsStream closed");
        Serial.println("waiting...");
        while(millis() - previousMillis < INTERVAL){
        }
        previousMillis = millis();
    }

    void clearTcpBuffer(){
        for(int i = 0; i < 370; i++){
            tcpBuffer[i] = 0;
        }
    }
    Он не дает никакого выхода. Вообще. Порты открываются последовательно никаких конфликтов между ними быть не должно, а уж тем более и с HardwareSerial портом. В чем тут проблема?

    З.Ы. по отдельности код считывания GPS координат и отсылки пакетов работает
    ЗЗЫ все комплектующие амперки, библиотека GPRS трекера отредактирована, чтобы не конфликтовали глобальные переменные
     
  2. AlexU

    AlexU Гуру

    С учётом другого функционала -- это слишком высокая скорость для программного Serial, МК не справляется. Да и вообще два программных Serial'а -- это очень напряжно для МК, работающего на частоте 16 МГц.
     
    arkadyf нравится это.
  3. parovoZZ

    parovoZZ Гуру

    В говнокоде. Всё это реализуется на Сях. А ещё лучше на асме. Нет никакой проблемы в цикле считать одновременно весь порт, потом считанный байт также в цикле ногодрыгом отослать в другой порт.
     
  4. Да, но если вы они открываются последовательно. Закрывается один, открывается другой. Serial.write на 115200 работает нормально. По крайней мере, отдельный скетч по получению данных с GPS трекера через такую настройку работает
     
  5. ELITE

    ELITE Гик

    для софтваре сериал не надо выше 38400 ставить скорость и будет работать стабильно

    это суммарная стабильная скорость - если 2 софтваре сериала - то на каждый по 19200

    на 4 порта - по 9600 потолок
     
  6. всм? Я школьник, проект у меня такой, ассемблера не знаю.
     
  7. parovoZZ

    parovoZZ Гуру

    что в твоем понимании открыть порт?
     
  8. Serial.begin() - открывает
    Serial.end() - закрывает
    Разве нет? Если не так, просветите меня))