Go Down

Topic: Problem mit PacketBuffer bei UDP-Empfang ? (Read 886 times) previous topic - next topic

kuno86

Feb 11, 2011, 05:24 pm Last Edit: Feb 14, 2011, 05:35 pm by kuno86 Reason: 1
Hallo,
ich habe in den lezten Tagen ein Programm für meinen Arduino "ATmega328" mit Ethernetshield und L298P-Motorshield geschrieben, dass ein RC-Auto kontrollieren kann.
Ich sende mit einem VB-Programm einen 8-Stelligen String den ich im Arduino mit über ein Char array auslesen kann.
Soweit funktioniert auch noch alles einwandfrei.

Nun habe ich allerdings noch ein Problem:

Das Arduino-Programm nimmt manchmal nach einer Bestimmten Zeit keine neuen Netzwerkdaten mehr an und hat verschiedene Symbole im Steuerstring, die nicht vom VB-Programm kommen.
Ich bin mir nicht sicher, ob sich das Ethernetshield aufhängt, jedenfalls hilft dann nur noch der Reset-knopf oder code neu hochladen.

Hier noch mein aktueller Quellcode:
Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <Udp.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 56, 35, 178 };
byte gateway[] = { 10, 56, 35, 1 };
byte subnet[] = { 255, 255, 255, 0 };

#define MAX_SIZE 32 // maximum packet size
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet
byte remoteIp[4]; // holds recvieved packet's originating IP
unsigned int remotePort; // holds received packet's originating port

const int ledPin = 13;

int E1 = 5;
int M1 = 4;
int E2 = 6;
int M2 = 7;


void setup() {
 Ethernet.begin(mac, ip , gateway, subnet);
 Udp.begin(9100);
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);
 pinMode(M1,OUTPUT);
 pinMode(M2,OUTPUT);
}

void loop() {
 int packetSize=Udp.available();  // holds received packet size
 int DriveSpeed = 0;
 boolean SteuerFehler;
 if(packetSize)
   {
   digitalWrite(ledPin,HIGH);
   int packetSize = packetSize-8;   ws // minus 8-Bit Header
   Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
   Serial.println(packetBuffer);
   Serial.println(packetSize);
   }
 if(packetSize==0)
   {digitalWrite(ledPin,LOW);}

/*    
for (int i=1;i!=8;i++)    //Sucht nach ungültigen Zeichen im Steuerstring
 {
 SteuerFehler=false;
 if(packetBuffer[i]!='-' |packetBuffer[i]!='x' |packetBuffer[i]!='0' |packetBuffer[i]!='1' |packetBuffer[i]!='2' |packetBuffer[i]!='3' |packetBuffer[i]!='4' |packetBuffer[i]!='5' |packetBuffer[i]!='6' |packetBuffer[i]!='7' |packetBuffer[i]!='8' |packetBuffer[i]!='9')
   {SteuerFehler=true;}
 }
 
 
 
if (SteuerFehler)
 {
 Serial.println("--------Fehler--------");
 packetBuffer[0]='-';    //Reset des Steuerstring auf alles aus
 packetBuffer[1]='-';
 packetBuffer[2]='-';
 packetBuffer[3]='-';
 packetBuffer[4]='-';
 packetBuffer[5]='-';
 packetBuffer[6]='-';
 packetBuffer[7]='-';
 
 //Udp.close();        //Udp resetten zum fixen ?!?
 //Udp.begin(9100);    //Udp.close() geht nicht...???
 
 SteuerFehler=false;
 }
*/

if(packetBuffer[4]!='-')
 {
   switch(packetBuffer[4]){
   case '0': DriveSpeed=30;break;
   case '1': DriveSpeed=55;break;
   case '2': DriveSpeed=80;break;
   case '3': DriveSpeed=105;break;
   case '4': DriveSpeed=130;break;
   case '5': DriveSpeed=155;break;
   case '6': DriveSpeed=180;break;
   case '7': DriveSpeed=205;break;
   case '8': DriveSpeed=230;break;
   case '9': DriveSpeed=255;break;
   }
 }
 
if(packetBuffer[0]=='-' | packetBuffer[1]=='-') //Stillsttand
   {analogWrite(E1,0);}
if(packetBuffer[0]=='x')  
   {digitalWrite(M1,HIGH);analogWrite(E1,DriveSpeed);} //Rückwärts ?    //
if(packetBuffer[1]=='x')                       //
   {digitalWrite(M1,LOW);analogWrite(E1,DriveSpeed);}  //Vorwärts ?     //


if(packetBuffer[2]=='-' | packetBuffer[3]=='-') //Geradeaus
   {analogWrite(E2,0);}
if(packetBuffer[2]=='x')                        //Links
   {digitalWrite(M2,LOW);analogWrite(E2,255);}  
if(packetBuffer[3]=='x')                        //Rechts                  
   {digitalWrite(M2,HIGH);analogWrite(E2,255);}      
   

}


Falls nötig kann ich auch noch mein VB-Programm hochladen.
Danke schonmal  :)


Ist irgendwie gelöst, da es komischerweise nur noch auftritt, wenn ich die COM-Konsole offen hab :~

Go Up