Писал тут я 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 трекера отредактирована, чтобы не конфликтовали глобальные переменные
С учётом другого функционала -- это слишком высокая скорость для программного Serial, МК не справляется. Да и вообще два программных Serial'а -- это очень напряжно для МК, работающего на частоте 16 МГц.
В говнокоде. Всё это реализуется на Сях. А ещё лучше на асме. Нет никакой проблемы в цикле считать одновременно весь порт, потом считанный байт также в цикле ногодрыгом отослать в другой порт.
Да, но если вы они открываются последовательно. Закрывается один, открывается другой. Serial.write на 115200 работает нормально. По крайней мере, отдельный скетч по получению данных с GPS трекера через такую настройку работает
для софтваре сериал не надо выше 38400 ставить скорость и будет работать стабильно это суммарная стабильная скорость - если 2 софтваре сериала - то на каждый по 19200 на 4 порта - по 9600 потолок