UDP Server mit LM3S6965

OP #997974
Lesenswert?

Hi Leute !

vor kurzer Zeit habe ich mir das LM3S6965 Evaluation Board zugelegt 
welches über eine ethernet Schnittstelle verfügt.

Folgendes hab ich vor:

ich möchte zunächsteinmal übers Ethernet (protokoll UDP) datenpackete 
zwischen einem PC und dem Evaluation Board hin und her schicken. Ich hab 
da auch schon was in Visual c++ Programmiert es funktioniert auch.

Nun möchte ich das Board als Server einrichten und den PC als Client.

Mein Problem ist es nun den Code im Microcontroller umzusetzen, hab 
bisher noch nicht viel in dieser richtung gemacht. Die Basics sind aber 
vorhanden.

Wo ich momentan hänge ist das ich z.B. unter visual Studio 2005 gibt es 
fertige headerfiles wie "winsock2.h" usw mit derren Hilfe ich dann die 
Sockets anfordern freigeben binden usw. kann alles was man halt zur 
initialisierung der sockets braucht ist da vorhanden.

wie wird diese sache in Luminary umgesetzt?? es gibt Demos die ich schon 
zum laufen gebracht habe allerdings finde ich nirgends ein 
funktionsaufruf wo irgendwelche sockets initialisiert werden.

ich hab im forum über diese thema gesucht aber hab festgestellt das noch 
nicht soviele beiträge über dieses Board vorhanden sind. (Sorry falls 
ich mich irren sollte)

Meine Daten:

Mikrocontroller:    Evaluation Board LM3S6965
Kompiler :          IAR Embedded Workbench IDE 5.11 (Kickstart Version)
Programmiersprache: c/c++

ich wäre euch sehr dankbar wenn ihr mir da hilfe leisten könntet. Ich 
möchte keine fertigen Codes nicht das Ihr mich falsch versteht nur ne 
kleine starthilfe ein tutorial über Sockets in uc oder so ähnlich wäre 
schon ausreichend.

Vielen Dank im vorraus
Persönliche Seite #998054
Lesenswert?

Auf einem Mikrocontroller gibt es kein "Betriebssystem" mit fertigen 
Funktionen. Man muss das alles selbst schreiben.
Das heißt, wenn du UDP haben möchtest, dann musst du UDP und auch die 
Schichten unter UDP programmieren: IP und Ethernet.
Man muss das Rad aber nicht neu erfinden, da es bereits fertige 
Ethernet-Stacks (z.B. uIP, lwIP) oder kleine RTOS (z.B FreeRTOS) für uCs 
gibt.
Beispiele für uIP und lwIP sind bei der Luminary Driverlib mit dabei.
OP #1001762
Lesenswert?

@  Andreas Watterott : Vielen Dank für deine Hilfe erstmal.

Ich habe mir die Dokumnetation über die Library von Luminary 
durchgelesen und hab auch jetzt das teil soweit zum laufen gebracht das 
es zumindestmal die Ethernet Schnitstelle Initialisiert.

Ich kann aber noch keinen Ping an den controller senden bzw. er reagiert 
noch  nicht darauf liegt es vielleicht daran das ich

a) noch keine IP Adresse zugewiesen habe oder
b) Kann es sein das der Switch ihm irgend eine IP zugewiesen hat?

wenn ich über windows command einen ping sende, sendet er das über UDP 
oder TCP ?

und zuguter letzt ist es richtig das der uIP stack dasselbe wie IP Stack 
ist nur das es auf einem mikrocontroller zugeschnitten ist ??

sorry wenn ich soviele fragen stelle aber als anfänger in diesem gebiet 
kann mann echt verzeweifeln :-(

ich hab noch meinen Code angehängt vielleicht mache ich ja auch was 
falsch

Vielen Dank im vorraus

fahri
Angehängte Dateien:
Persönliche Seite #1001908
Lesenswert?

Dir fehlt noch die IP- und ICMP-Schicht um einen Ping zu verarbeiten.
Schau dir mal das uIP-Beispiel aus der Driverlib an.

Celik Fahri wrote:
> wenn ich über windows command einen ping sende, sendet er das über UDP
> oder TCP ?
Ping ist ein ICMP-Echo-Request (Ethernet->IP->ICMP):
http://de.wikipedia.org/wiki/Internet_Control_Message_Protocol

> und zuguter letzt ist es richtig das der uIP stack dasselbe wie IP Stack
> ist nur das es auf einem mikrocontroller zugeschnitten ist ??
Ja, uIP ist ein uC Ethernet-Stack mit ARP, IP, ICMP, UDP, TCP...
OP #1003173
Lesenswert?

ok, jetzt funktionierts auch mit dem Ping wenn ich das richtig sehe 
befinde ich mich nun auf der 4.schicht des OSI-Modells. Jetzt kommt ja 
das eigentliche Programm undzwar die Programmierung für das UDP 
Protokoll.

in c habe ich ein Programm das nachdem UDP Prinzip arbeitet um 
Datagramme zu lesen und zu senden.In diesem Code ist eine Funktion die 
sich dg_echo nennt.

void
dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
        int n;
        socklen_t len;
        char mesg[MAXLINE];

        for(;;)
        {
            len = clilen;
            n = Recvform(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);

            Sendto(sockfd, mesg, n, 0, pcliaddr, len);
        }
}

RECVFORM und SENDTO sind einfach befehle, die am jeweiligen Port die 
eintreffende Datagramm liest bzw. sendet.

so wie ich es nun verstanden habe gibts in der Lib von Luminary dafür 
die Funktionen EthernetPacketGet(...) und EthernetPacketPut(...).

würde das ganze nach diesem Prinzip funktionieren wenn ich die 
funktionen recvform und sendto ersetze ?

Danke
OP #1007675
Lesenswert?

Hi ich mal wieder...

ich hänge an einem Problem wo ich gerade nicht weiterkomme....

ich scheitere immer wieder bei jedem versuch ein eigenes Projekt 
anzulegen.

ein kleines Beispiel zur verdeutlichung meines Problems...

#include "../rit128x96x4.h"

int main()
{
   RIT128x96x4Init(1000000);
   RIT128x96x4StringDraw("HALLOOOOOOOOOOOO",0,15,15);

  return 0;
}

ganz einfacher Code wo mir den text hallo auf dem display ausgeben soll, 
laut anleitung soll ich dazu den header rit128x96x4.h einbinden. Nur in 
diesem Header file sind nur die Protoypen der funktion drin die 
eigentliche Deklaration ist extern und befindet sich in rit128x96x4.c.

bisher alles schön und gut sobald ich aber rit128x96x4.c in mein Projekt 
hinzufüge bekomme ich zich Link fehler vom compiler der grund liegt wohl 
darin das noch andere funktionen sich in diesem rit128x96x4.c befinden 
die wiederum andere header bzw c files benötigen ??.

Es kann doch nicht sein das ich nur für ein einfachen text die ganze lib 
einbinden muss... oder ich mach einen ganz gravierenden Fehler denn ich 
nicht blicke.

Es gibt ne menge Optionen welche mann verändern kann ich hab sogar 
original Projekte genommen damit ich wenigstens die gleichen 
Einstellungen habe aber ohne Erfolg.... Natürlich habe ich auch das 
Projekt in dem Ordner angelegt wo sich auch die demos befinden damit die 
header files auch vom compiler gefunden werden.

was mache ich falsch ??
OP #1007888
Lesenswert?

Hallo Andreas,

danke für deine Hilfe jetzt gehts mit dem Projekt hab so wie du es 
gesagt hast die driverlib.a eingefügt und schon gings.

ich hab mich jetzt entschieden das ganze doch eher mit LWIP zu 
programmieren das ist angenehmer für mich da die struktur anlegen socket 
bind socket usw ähnlich ist wie bei windows.

beim Anlegen des IP stack bin ich auf die funktion lwIPinit() gestoßen, 
beim anwenden dieser funktion hab ich aber noch ein Problem. Ich möchte 
eine feste IP und SubnetMask nutzen. Wie könnte ich dieser Funktion eine 
feste IP übergeben?

ich hab meinen Code mal angehängt. ich komm da momentan beim "anlegen 
eines IP stacks" nicht mehr weiter das anlegen von UDP socket hoffe ich 
müsste mit der funktion UDP_echo_init() gehen.

danke im vorraus
Angehängte Dateien:
Persönliche Seite #1007980
Lesenswert?

Ich kenne mich mit den Ethernet-Stacks auch nicht so aus.
Das lwIP-Beispiel hast du dir ja schon angeschaut.

Die lwIPInit() Funktion kommt aus:
driverlib/utils/lwiplib.c
Da stehen dann auch die Parameter. Als weitere Info gibt es noch die 
Docu zu lwIP:
driverlib/third_partylwip-x.x.x/doc

Die lwIP-Initialisierung müsste dann in etwa so aussehen:
1
unsigned long ip  = ((192<<0)|(168<<8)|(  0<<16)|(  1<<24));
2
unsigned long msk = ((255<<0)|(255<<8)|(255<<16)|(  0<<24));
3
unsigned long gw  = ((192<<0)|(168<<8)|(  0<<16)|(100<<24));
4

5
lwIPInit(pucMACArray, ip, msk, gw, IPADDR_USE_STATIC);

EthernetPacketGet() und EthernetPacketPut() darfst du nicht verwenden. 
Diese Funktionen werden von lwIP aufgerufen.


PS: Bitte keine DOC-Dateien als Anhang. Für Code reicht nur Text.
OP #1008442
Lesenswert?

ok danke.. nun kann ich ein echo auf meinem controller senden und er 
amtwortet auch darauf.... ich habe gemerkt das der fehler im lwipopts.h 
lag da war die funktion LWIP_UDP  nicht aktiviert ! es gibt noch ne 
menge andere funktionen die mann ein bzw. ausschalten kann. Kennst du 
dich mit diesen Einstellungen aus oder gibt es vielleicht irgendwelche 
fertigen Voreinstellungen für Ethernet über UDP ?

Es ist echt schlimm wirklich ein Projekt zum Laufen zu bringen da sucht 
mann im Code nach fehlern dabei ist es nur ne Konfigurationssache.
OP #1025614
Lesenswert?

So die Implementierung von LWIP läuft zunächstmal. Jetzt habe ich 
wenigstens schonmal ein Grundgerüst wo ich drauf aufbauen kann.

ich habe nun einen LCD 16x2 Display (MFC-C162DNLR-4N-E Hersteller:TRULY 
siehe Datenblatt) an den Evaluation KIT angebunden. Elektrisch nach 
folgendem Schema:

BLA  ----------->  3,8 V
BLK  ----------->  GND
VSS  ----------->  GND
VCC  ----------->  5 V
V0   ----------->  0.3 V (Kontrast)
RS   ----------->  PB5 / C1-
R/W  ----------->  PC2 / TD1
E    ----------->  PC2 / TD0
DB0  ----------->  PB0 / PWM2
DB1  ----------->  PB1 / PWM3
DB2  ----------->  PB2 / I2C0SCL
DB3  ----------->  PB3 / I2CSDA
DB4  ----------->  GND
DB5  ----------->  GND
DB6  ----------->  GND
DB7  ----------->  GND

sollte eigentlich soweit in ordnung sein zumindest läuft es ohne 
probleme bis auf den Kontrast den muss ich noch anpassen da das Display 
noch ein wenig schwach leuchtet.

den Code häng ich auch noch gleich mit dazu, dabei bin ich nach 
folgender Struktur vorgegangen:

1. Pins definieren
2. Pins als Ausgänge setzen
3. Pins auf LOW setzen
4. Interrupt Starten
5. ???
6. ???
7. ???
.
.
.
X.

Schritt 1-4 habe ich mal versucht zu programmieren bin mir aber nicht 
sicher ob ich wirklich auch die richtigen Pins anspreche zumindest 
mekert mein Kompiler nicht.

Die Schritte 5-X sollten dann den eigentlichen Datenverkehr (Senden, 
empfangen von Strings etc.) beinhalten.

Meine Bitte : Könnte jemand mal nachschauen ob ich auf dem richtigen 
Dampfer bin ??

vielen Dank im Voraus
Angehängte Dateien:
OP #1029159
Lesenswert?

ich bins mal wieder

ich hab Probleme meine Pins am Evaluation Board zu setzen. Der 
GPIOPinWrite Befehl hat kein effekt die Pins werden nicht gesetzt. Ich 
hab zur Kontrolle paar If Schleifen eingefügt um zu sehen ob sich an den 
Pins überhaupt was tut leider ohne erfolg irgendwie ist der erste Pin 
immer HIGH und die restlichen Pins immer auf LOW. Das Ganze spielt sich 
auf dem PORT E pin 0-4 ab. Ich vermute mal das ich noch eine kleinigkeit 
ergänzen muss ,in der Library beschreibung habe ich aber keine weiteren 
hinweise gefunden.


Kann mir da jemand helfen ???


danke im voraus
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren