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:
#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 :~