Поправил, вот так стала вроде более стабильно работать, только при изменение массива char ReplyBuffer[100]; больше 100 начинает все равно зависать, если меньше 100 то вроде нормально Код (C++): #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> int microphonePin = A0; // выбор пина для входа от микрофона int microphoneValue = 0; // переменная для хранения значения от микрофона int i = 0; // для счетчика считывания аналоговых покозаний String str = ""; // IP-адрес byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 33); unsigned int localPort = 8; // локальный порт, который будем прослушивать // буферы для отправки данных char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // буфер, в котором будет храниться входящий пакет char ReplyBuffer[100]; // строка, которая будет отсылаться обратно // Создаем экземпляр класса EthernetUDP, чтобы отправлять пакеты через UDP: EthernetUDP Udp; void setup() { // Запускаем Ethernet и UDP: Ethernet.begin(mac,ip); Udp.begin(localPort); Serial.begin(9600); Serial.print("My IP address: "); Serial.print(Ethernet.localIP()); } void loop() { // Если есть какие-либо доступные данные, считываем пакет: int packetSize = Udp.parsePacket(); if(packetSize) { IPAddress remote = Udp.remoteIP(); // Serial.println(packetBuffer); Serial.println (ReplyBuffer); Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); // отправляем значение Udp.write(ReplyBuffer); Udp.endPacket(); str=""; } delay(10); mic(); } // записываем данные в буфер(массив) void mic(){ str= str+String(analogRead(microphonePin), DEC)+"|"; if(str.length()==100){ str.toCharArray(ReplyBuffer,100); } }
Подскажите не пойму почему вешается ардуино когда идет обращение к ней по UDP Зависание происходит из-за очистки массива memset(&ReplyBuffer,0,sizeof(ReplyBuffer)); Код (C++): #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> const int sampleWindow = 50; // Sample (50 mS = 20Hz) unsigned int sample; int i = 0; // для счетчика считывания аналоговых покозаний String str = ""; unsigned int localPort = 8; // локальный порт, который будем прослушивать // буферы для отправки данных char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // буфер, в котором будет храниться входящий пакет char ReplyBuffer[100]; // массив строка, которая будет отсылаться обратно // Создаем EthernetUDP, чтобы отправлять пакеты через UDP: EthernetUDP Udp; // Enter a MAC address byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // Initialize the Ethernet client library EthernetClient client; void setup() { // Open serial Serial.begin(9600); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // no point in carrying on, so do nothing forevermore: for (;;) ; } // print your local IP address: Serial.print("My IP address: "); for (byte thisByte = 0; thisByte < 4; thisByte++) { // print the value of each byte of the IP address: Serial.print(Ethernet.localIP()[thisByte], DEC); Serial.print("."); Udp.begin(localPort); // открываем порт UDP } Serial.println(); } void loop() { //опрос микрофона mic(); // Если есть какие-либо доступные данные, считываем пакет: int packetSize = Udp.parsePacket(); if(packetSize) { IPAddress remote = Udp.remoteIP(); //Выводим ip b порт удал компа и данные массива // Serial.println(packetBuffer); // Serial.println (Udp.remoteIP()); //порт // Serial.println (Udp.remotePort()); // Serial.println (ReplyBuffer); Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); // отправляем значение Udp.write(ReplyBuffer); Udp.endPacket(); //очистить строку и массив str=""; // Если закомментить строку очистки массива то все работает, но массив не обновляется и данные отправляются одни и теже memset(&ReplyBuffer,0,sizeof(ReplyBuffer)); } delay(10); } void mic(){ unsigned long startMillis= millis(); // Start unsigned int peakToPeak = 0; // Максимальный уровень unsigned int signalMax = 0; unsigned int signalMin = 1024; // collect data for 50 mS while (millis() - startMillis < sampleWindow) { sample = analogRead(0); if (sample < 1024) // Выкидывать ложные показания { if (sample > signalMax) { signalMax = sample; // Сохранить только максимальные уровни } else if (sample < signalMin) { signalMin = sample; // Сохранить только минимальные уровни } } } peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude str= str+String(analogRead(peakToPeak), DEC)+":"; if(str.length()==100){ str.toCharArray(ReplyBuffer,100); //Serial.println(ReplyBuffer); // str=""; // memset(&ReplyBuffer,0,sizeof(ReplyBuffer)); } }
а как тогда мне данные обновлять, если я его не очищаю то данные постоянно одни и те же на удаленном ПК принемаются
Передается одно и тоже значение 348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391 172.18.227.214 348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391 172.18.227.214 348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391 172.18.227.214 348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391 172.18.227.214 348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
Это данные с микрофона если очищать массив, видно , что данные изменяются 359:387:377:349:360:591:359:363:384:381:375:350:384:348:349:315:343:369:365:365:372:359:224:363:291 385:367:378:376:248:352:348:390:366:342:400:306:354:345:368:416:364:330:344:354:359:347:586:336:353 401:411:377:374:360:368:354:496:343:436:377:356:367:355:391:359:348:544:368:362:364:359:360:360:424 376:346:393:322:406:356:258:374:370:376:330:355:370:359:341:383:386:301:324:365:356:336:351:345:340 386:375:364:347:354:374:316:377:358:358:367:416:353:364:348:263:334:355:349:366:378:377:353:346:352 355:366:361:379:345:379:387:362:336:358:344:337:351:366:362:350:354:375:363:380:359:358:332:344:374 337:365:351:366:344:362:344:358:395:371:348:366:365:370:366:362:345:365:361:383:379:387:384:341:362