PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Control mit VB.NET



CowZ
18.11.2006, 20:34
Hi,

auf Anfrage (https://www.roboternetz.de/phpBB2/viewtopic.php?p=229188) kommt hier der Thread für mein Controlprogramm.

Dieses Controlprogramm soll mehrere Funktionen haben / bekommen:
1) Ausgabe von ein- und ausgehenden Daten mit
_a) Dezimalwerten
_b) Binärwerte
_c) ASCII-Zeichen

2) Senden von Daten per manueller Eingabe

3) Senden von Daten durch Makros
_a) Zeitgesteuert
_b) Nach Empfang vorher definierter Werte

4) Anzeige von eingehenden Daten als graphische Kurve (mit Skala)

5) Eure Wünsche

Das ganze dauert eventuell ein wenig länger, ich werde zwischen Versionen hier veröffentlichen. Ihr benötigt das .NET 2.0 Framework, dieses bekommt ihr u.a. bei Microsoft.

Ich hoffe, dieses Projekt findet ein wenig Anklang :P

Gruß, CowZ

ACDC
18.11.2006, 20:39
Hi !

Ich finde das klasse, dass Du sowas machen willst. Wird das im Prinzip einer "Einführung in die Programmierung einer seriellen Schnittstelle unter VB.Net" sein, oder wie muss ich mir das vorstellen ? Kann man Deine Beispiele unter dem kostenlosen Visual Basic Express nachvollziehen und laufen lassen ?

Gruß, Andreas

CowZ
18.11.2006, 20:48
Hi,
Die direkte Kommunikation mit der seriellen Schnittstelle ist ziemlich einfach - es handelt sich um wenige Zeilen Code. Der Rest ist dann "nur noch" das drumherrum. Das zu erklären ist sehr schwierig, wenn ich nicht weiß, von welchem Startpunkt (==Kenntnisstand) anfangen kann.

Daher wird es eher auf ein fertiges Programm hinauslaufen, dessen Code man auch im kostenlosen VBEE laufen lassen kann (hoffentlich ;)). Ich werde versuchen den Code möglichst gut zu kommentieren und bei Fragen stehe ich immer zur Verfügung.

Wenn sich allerdings ein paar finden, die so eine Einführung gerne haben wollen und man sich auf ein "Mindestkenntnisstand" einigt, kann ich das auch gerne hier und später im Wiki erläutern :)

Schlagt vor, wie ihr euch das vorstellt :)

Gruß, CowZ

raoul4
18.11.2006, 22:11
Super Idee :cheesy:

ACDC
18.11.2006, 22:55
Daher wird es eher auf ein fertiges Programm hinauslaufen, dessen Code man auch im kostenlosen VBEE laufen lassen kann (hoffentlich ;)). Ich werde versuchen den Code möglichst gut zu kommentieren und bei Fragen stehe ich immer zur Verfügung.
Genau das würde mir persönlich schon reichen ... kommt ja auch ganz auf die Güte der Kommentare an :)

Gruß, Andreas

CowZ
18.11.2006, 23:53
Hi,

hier kurz der Code für die Kommunikation mit der Seriellen:
(ohne Kommentare und ausm Kopf aufgeschrieben und teilweise gecopypastet. Anpassung an die Applikation sind notwendig ;))



' Declaration:
Public WithEvents Connection As System.IO.Ports.SerialPort

' Settings:
Connection.BaudRate = 9600
Connection.DataBits = 8
Connection.Handshake = IO.Ports.Handshake.None
Connection.Parity = IO.Ports.Parity.None
Connection.PortName = "COM1"
Connection.Encoding = System.Text.Encoding.ASCII
Connection.StopBits = IO.Ports.StopBits.One
Connection.Open()

' Threadworkaround:
Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived
Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting())
End Sub
Delegate Sub ReceiveHandler(ByVal data As String)

Public Sub Receive(ByVal text As String)
MessageBox.Show(text)
End Sub


Gruß, CowZ

ACDC
19.11.2006, 09:30
Hi,

hier kurz der Code für die Kommunikation mit der Seriellen:
(ohne Kommentare und ausm Kopf aufgeschrieben und teilweise gecopypastet. Anpassung an die Applikation sind notwendig ;))



' Declaration:
Public WithEvents Connection As System.IO.Ports.SerialPort

' Settings:
Connection.BaudRate = 9600 // 9600 Bit/s
Connection.DataBits = 8 // 8 Datenbits
Connection.Handshake = IO.Ports.Handshake.None // kein Handshake (XON/XOFF oder RTS/CTS)
Connection.Parity = IO.Ports.Parity.None // kein Paritätsbit
Connection.PortName = "COM1" // Schnittstelle
Connection.Encoding = System.Text.Encoding.ASCII // Codierung = ASCII ???
Connection.StopBits = IO.Ports.StopBits.One // 1 Stopbit
Connection.Open() // Verbindung öffnen
// Connection. Close() // Verbindung schließen

' Threadworkaround:
Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived
Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting())
End Sub
Delegate Sub ReceiveHandler(ByVal data As String)

Public Sub Receive(ByVal text As String)
MessageBox.Show(text)
End Sub


Ich habe bei der Initialisierung mal reingeschrieben, was ich denke, was es heißen soll :-)

Nur durch die beiden Programmroutinen steige ich nicht durch. Empfängt die Schnittstelle jetzt IMMER, und puffert alles, bis ich das nächste Mal "Receive" aufrufe ? Und wie geht entsprechend das Senden von Daten ?
Und das eine Setting "Encoding", wozu braucht VB das ? Der muss doch mir überlassen, ob ich Text oder Daten übertrage :-) Und was sind die alternativen Einstellungen zu "ASCII" ?

Aber ein erstes "Danke " ist Dir gewiss :-)

Gruß, Andreas

CowZ
19.11.2006, 13:00
Hi,
genau, die Initialisierungen sind so richtig kommentiert.
Die Zeile mit dem Encoding kannst du auch weg lassen. aber wenn du da Big Endian (die anderen Möglichkeiten stehen alle in System.Text.Encoding) oder so reinschreibst, interpretiert die Schnittstelle die eingehenden Daten nicht richtig (weil die anders angeordnet sind als reine ASCII Zeichen).

Zu den Methoden:
Die Schnittstelle läuft ab dem Connection.Open. Ab da empfängt sie Daten. Kommen nun Daten, so wird ein Event ausgelöst. Dieses Ereignis / Event heißt DataReceived.

Dieses Event wird in

Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived
Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting())
End Sub behandelt ("Handles...").
Da dieses Event allerdings in einem anderen Thread als das Hauptprogramm läuft, musst du den umständlichen Weg über Delegate und Invoke gehen. Entweder es reicht dir so, oder du musst dir das inner Hilfe durchlesen, besser erklären kann ich das auch nich :P

Die Methode Receive wird so jedes Mal aufgerufen, wenn die Schnittstelle Daten empfängt. Als Parameter "text" werden dabei dann die empfangenen Daten übergeben.

Gruß, CowZ

ACDC
19.11.2006, 13:20
Da dieses Event allerdings in einem anderen Thread als das Hauptprogramm läuft, musst du den umständlichen Weg über Delegate und Invoke gehen. Entweder es reicht dir so, oder du musst dir das inner Hilfe durchlesen, besser erklären kann ich das auch nich :P
Bahnhof ? Koffer klauen ? Ich hatte gehofft, dass Du genau aber der Stelle mal genau erklären könntest, was da geproggt werden muss, denn die Initialisierung hätte ich auch noch hinbekommen, aber das Senden und das Empfangen von Zeichen ist unter VB.net nicht so ganz einfach zu durchschauen, denke ich.


Die Methode Receive wird so jedes Mal aufgerufen, wenn die Schnittstelle Daten empfängt. Als Parameter "text" werden dabei dann die empfangenen Daten übergeben.
Wird diese Methode nach JEDEM empfangenen Zeichen aufgerufen ? Und was passiert, wenn ich mich um das Retten dieser Zeichen nicht kümmere ? Werden die dann überschrieben, oder werden die neuen Zeichen an die alten angehängt, so dass ich den "Receive-String" dann mittels String-Manipulation auseinandernehmen kann ?

Hast Du mal ein lauffähiges Beispiel, an dem man das ganze auch mal praktisch durchgehen kann ?

Gruß, Andreas

CowZ
19.11.2006, 13:38
Hi,

das oben genannte Beispiel ist nach leichten Anpassungen lauffähig. Diese Methode wird nach allen empfangenen Daten aufgerufen, normalerweise sollte das ein Zeichen sein, näheres müsstest du der Hilfe entnehmen. Der Receivestring ist dann immer nur das neueste empfangene. Wenn du dich um das "Retten" nicht kümmerst, sind die Daten nach "Receive ... End Sub" weg.

Das lauffähige Beispiel kann ich dir vllt heut nachmittag schicken, bin grad busy... Außerdem steht alles wichtige oben, das solltest du auch "verpacken" können :)

Gruß, CowZ

Andun
20.11.2006, 15:05
Mal als Zwischenfrage. Du machst dass oben ja so, dass du eine Connection Objekt benutzt, ne?

Du benutzt doch auch die Visual Basic Expressedition 2005, die ja auf dem .Net Framwork 2.0 aufbaut, oder?
Weil da gibts doch einfach eine SerialPort Klasse, von der man ein Objekt benutzen kann. Warum nciht das? Das scheint mir sehr viel einfacher, wenn ich im Entwurfsmodus einfach ein Objekt davon rein ziehe und dann die Eigenschaften direkt setze. Dann spar ich mir den Code.

Und die DataRecieved Ereignisse werden dann natürlich auch behandelt.

Oder hab ich da grade nen Denkfehler drinne?

Andun

CowZ
20.11.2006, 22:00
Hi,

Ob du das Control "reinziehst" oder "Public WithEvents Connection As System.IO.Ports.SerialPort" schreibst, ist egal, das ist genau das gleiche.

Gruß, CowZ

ACDC
20.11.2006, 22:12
Das lauffähige Beispiel kann ich dir vllt heut nachmittag schicken, bin grad busy...
Hast Du schon Zeit dafür gehabt ? ;-)

Gruß, Andreas

CowZ
20.11.2006, 22:22
Ähm... Sorry, nein... Diese Woche ist vollstress...

Hast du schon versucht aus meinen Codesnippets was eigenes zu basteln? Sollte eigentlich möglich sein :) *hoff*

Gruß, CowZ

raoul4
20.11.2006, 22:30
ich werde mir das morgen auch mal angucken und schaun ob ich ein programm zu stande bekomme.
danke sehr für die tipps, cowz

raoul4
22.11.2006, 14:42
ich habe mal ein simples, sehr verbesserungswürdiges terminal geschrieben, aber die grundfunktionen funktionieren. senden und empfangen in ascii :). hoffe man kann es öffnen in vb .net...

mfg

http://raoul4.de/terminal.rar

CowZ
30.11.2006, 18:36
Hi,

es tut mir wirklich sehr leid, ich würde dieses Projekt gerne weiter und zu Ende machen.

Leider habe ich erstmal keine Zeit mehr dazu... LK-Klausuren und Weihnachten stehen an... sry :(

Ich hoffe, ihr kommt mit meinem Codesnippet und Raouls Programm klar / weiter :) Sonst fragt einfach :)

Gruß, CowZ

Andun
28.12.2006, 17:19
Moin

Würde mich freuen, falls hier wieder was passieren würde, da ich leider ein paar Probleme habe.

Ich wollte zum ausprobieren einfach mal den Asuro Transciever anstöpseln, aber das was ich sende empfange ich, (anders als im Hyperterminal) nicht wieder...

Seltsamer weise.

Wäre schön, wenn jemand nen Tipp hat.

CowZ
28.12.2006, 17:51
Ich denke, es wird an deinem Code liegen ;)

Kannst ja mal die wichtigen Zeilen hier rein fügen.
(Vorallem: Initialisierung des seriellen Ports und die Empfangsroutine)

Gruß, CowZ

Andun
29.12.2006, 14:13
Moin

Ich hab das oben gepostete Archiv terminal.rar genommen und einfach dei Baudrate auf 2400 angepasst. Der Rest müsste also eignetlich alles stimmen mMn.

Andun

Nachtrag:

Ich hab jetzt mein Programm umgeschrieben und für meinen eigentlichen Bot eingestellt. Das mit dem Asuro ging immer noch nicht, aber jetzt kann ich mit meinen eigenem Bot kommunizieren.

Das einzige Problem ist noch irgendwie die Kodierung, weil bei Zahlen oder | nur Salat rauskommt. Mein Verdacht liegt auch bei der Zeilenendungskodierung, die ich meinen Bot machen lasse.

Das komplizierteste war aber erstmal das umstellen von dem Timer weg, da ich mit diesem überhaupt nciht klar gekommen bin.

Ich nutze jetzt dass DataRecieved Ereignis und dank der guten Hilfe (ja, das ist ein Lob an Microsoft ... wohl acuh das einzige im Jahre 2006 von mir) krieg ich dass sogar asynchron hin, da dies wohl in einem anderen Thread behandelt wird. Kompliziert, aber wenns geht einfach. :D


Sonst sag ich mal danke und am schluß werde cih es natürlich teilweise veröffentlichen.

Aber eine Frage ahb ich noch:

Mit dem SerialPort1.IsOpen kann ich NICHT abfragen ob z.b. HyperTerminal den Port belegt. Da krieg ich logischerweise dann ne Fehlermeldung. Wisst ihr wie ich testen kann ob ich im Moment auf die Schnittstelle zugreifen kann?

Danke

Andun

Andun
08.01.2007, 17:00
Leider muss ich jetzt hier nochmal pushen um dass Thema mal wieder aufzuwerfen.

Ich hab leider ein großes Problem:

Ausgangslage: Ich "benutze" meinen Roboter mit dem HyperTerminal -> alles geht gut und ist lesbar

VB: Ich empfang bei Encoding default keine Zahlen. (Scheint wohl Ascii zu sein)
Stell ich das Encoding manuell auf Unicode oder BigEndianUnicode, dann hab ich zwar alle Zahlen, aber der Text stellt sich mir nur Kästchen dar. Ich hab leider keinen Plan was da los ist und was ich ändern soll. Vorallem, da dass Hyperterminal, welches auf ANSI Terminalerkennung gestellt ist, alles richtig macht.

Ne Idee? Danke. Ich häng hier gleich noch meine VB Datei an.

Andun

http://www.subms.de/files/SUBMESS_PC_Client.rar

CowZ
08.01.2007, 18:57
Hi,

Das Encoding muss auf ASCII stehen.

An die "Zahlen" kommst du dann per Asc(Zeichen As String) ran. Das musst du dann irgendwo bei deiner Empfangsroutine einfügen...

(ich weiß, das ist kein schönes VB.NET, es sei mir verziehn ;))

Gruß Cowz

Andun
08.01.2007, 21:17
Moin

Achso ... :D Wenn ich die erst wieder zurückwandeln muss ... ist aber schon seltsam ... Naja, danke. Werd ich so machen.

Nachtrag:
Also ich versteh jetzt aber immer noch nicht, wie dass dann gehen soll? Ich wandel ja im µC schon die Zahlen in ihr Ascii pendant um, deswegen funktioniert es ja auch im Hyperterminal ...

Oder ich hab dich noch nciht richtig verstanden.

Danke

Andun

Nachtrag:

Ich hab es jetzt über folgende Konstruktion, welche aber sichtlich langsam alles aufbaut gelöst. Wenn du bitte ne besser Lösung hast, wäre ich dankbar.


Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Do
If SerialPort1.ReadBufferSize = 0 Then
Exit Do
End If
Me.SetText(Chr(SerialPort1.ReadChar()))
Loop
'Me.SetText(SerialPort1.ReadExisting) <-- ging ja nciht
End Sub

CowZ
09.01.2007, 17:34
Hi,

ansich müsste ReadExisting dir direkt den Text (also als ASCII Zeichen kodiert (65 => A)) ausgeben.

Bist du sicher dass du
Connection.Encoding = System.Text.Encoding.ASCII
gemacht hast?

Gruß, CowZ

Andun
09.01.2007, 22:02
Moin

Also:
Ich habe jetzt nochmal alles ausprobiert und habe immer noch die gleichen Symptome. Hier seht hier mal alles:

So sieht es im Hyperterminal aus und auch in meiner Variante mit der Schleife über jeden einzelen char wie ich oben gepostet habe:


COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
Geschrieben wurde: 6
Alle Werte aus dem EEPROM auslesen
18:07:41 08.01|87|188|97
18:10:00 08.01|87|188|97
22:32:57 08.01|87|188|97
22:39:00 08.01|87|188|97
22:39:25 08.01|87|188|98
22:40:00 08.01|87|188|98
22:49:15 08.01|87|188|97
22:50:00 08.01|87|188|97
22:51:33 08.01|87|188|98
22:52:19 08.01|87|188|98
22:57:00 08.01|87|188|97
22:58:24 08.01|87|188|97
usw.

So, sieht es aus, wenn ich das Encoding immer noch auf Ascii lasse, aber die Variante mit ReadExisting nutze:

COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
Befehl eingeben: Geschrieben wurde: 6
Alle Werte aus dem EEPROM auslesen
188:08|88
8
30.877|20 0|972:017188:18|88
8
54.877|26 0|983:017188:08|88
8
59.877|23 0|983:018


Wenn ich das Encoding auf Unicode stelle wird seltsamerweise zwar nicht mehr an Inhalt angezeigt, aber die Formatierung bei der Uhrzeit nimmt bessere Formen an:


COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
扁瑳湡獤敳獮牯湥›਍㈀㔵ഀ䈊瑩整䈠晥桥楥杮扥湥›਍獅猠湩⁤㄀  楍⹮ഠ 楄⁥敬穴整䴠獥畳杮眠牡甠   䴠湩*⸮*敭獳湥⸠⸮਍䄀汬獥洠獥敳൮
汁敬圠牥整搠牥氠瑥瑺湥愠瑫敵汬湥䴠獥畳杮猠数捩敨湲മ
asd摁敲獳㩥 ㈲7ഠ
湅敤猠数捩敨湲⤨മ
Geschrieben wurde: 6
汁敬圠牥整愠獵搠浥䔠偅佒⁍畡汳獥湥਍㄀㠀㨀 㜀㨀㐀㄀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
18:10:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㌀㈀㨀㔀㜀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
22:39:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㌀㤀㨀㈀㔀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
22:40:00 08.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㐀㤀㨀㄀㔀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
22:50:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㔀㄀㨀㌀㌀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
22:52:19 08.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㔀㜀㨀    㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
22:58:24 08.01|㜸簀㄀㠸簀㤀7਍㈀㌀㨀㄀ 㨀    㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
23:26:04 08.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㈀㜀㨀 ㄀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
23:27:06 08.01|㜸簀㄀㠸簀㤀7਍㈀㌀㨀㈀㤀㨀㈀   㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
23:30:00 08.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㔀 㨀㐀㔀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
23:53:39 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㔀㄀㨀㔀㜀  㤀⸀ ㄀簀㠀7|㠱8|2:53:27 09.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㔀㌀㨀㔀㠀  㤀⸀ ㄀簀㠀7|㠱8|㠹ഀ
23:00:00 09.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㄀ 㨀    㤀⸀ ㄀簀㠀7|㠱8|㠹ഀ


(Wie ich hier im Fenster grade sehe ist wohl ein Steuerzeichen für rechts nach links schreiben drinne, deswegen dass umdrehen, aber ich finde es beachtlich, dass hier die Formatierung mit Doppelpunkten bei der Uhrzeit stimmt, was bei Ascii ja nicht der fall ist)

Kann mir dass zufällig jemand ekrlären?

Hier die Datei:
http://www.subms.de/files/SUBMESS_PC_Client2.rar
(Ich weiß, dass die Fehlerbehandlung bei der Variante noch nicht richtig ist, aber das ist erstmal egal)

Danke

Andun

CowZ
10.01.2007, 20:25
Hi,

das einzige, was dich an der "ReadExisting"-Variante stört, sind doch die ungewollten Zeilenumbrüche oder?
Das liegt dann vermutlich entweder daran, dass er nach jedem Empfangendatenblock automatisch ein Zeilenumbruch sendet, oder deine Funktion zum Empfangen das macht... Kannst du diese Funktion nochmal posten? :)

Gruß, CowZ

Andun
10.01.2007, 21:31
Ne :D Leider sind es nicht nur die Umbrüche. Wenn du dir mal die gewollte ausgabe (1.) anschaust, siehst du dass die Daten auch gut für Menschen lesbar sind, mit Datum und dann 3 Werte getrennt durch einen |. Das ist leider bei der 2. Variante nicht der Fall.

Zum senden vom Robo aus, benutze ich die Funktionen aus dem RN Wiki + Asuro PrintInt sieht dann zusammen so aus:

uart.c

/*
UART Funktionen
*/
#include <avr/io.h>
#include "uart.h"
#include <stdlib.h>

#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)

void uart_init()
{
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CP U)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU );

// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

// Flush Receive-Buffer
do
{
unsigned char dummy;
(void) (dummy = UDR);
}
while (UCSRA & (1 << RXC));
}

void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}

/*Gibt einen Integer über die UART Schnittstelle aus*/
void PrintInt(int a){
char temp[10];
itoa(a,temp,10);
uart_puts(temp);
}

/*Übernommen und abgewandelt aus der Asuro Lib 2.6
ACHTUNG: In *data muss eine Platz mehr sein, als die Zeichenkette! (/0 Zeichen)
*/
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & (1 << RXC)) {
data[i++] = UDR;
time = 0;
}
Msleep(10);
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & (1 << RXC))
data[i++] = UDR;
}
}
data[length] = 0;
}

uart.h


/*
Header für uart.c
------------------------
Johannes Kreuzer - 2006
*/
#ifndef _UART_H_
#define _UART_H_

#include <avr/io.h>

extern void uart_init(void);
extern void Msleep(int dauer);

static inline void uart_putc (const char c)
{
while (!(UCSRA & (1 << UDRE)))
;

UDR = c;
}

static inline int uart_getc_wait(void)
{
while (!(UCSRA & (1 << RXC)))
;

return (int) UDR;
}

static inline int uart_getc_nowait(void)
{
return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}

#endif /* _UART_H_ */

/*Sendet einen String*/
void uart_puts (const char *s);

void PrintInt(int a);
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout);



Andun

CowZ
10.01.2007, 21:58
Mhhh komischer Fehler... Kann ich dir leider nicht weiterhelfen, sry...

Gruß, CowZ

Andun
10.01.2007, 22:50
Ja, ok. :D Hab ich ehrlich gesagt auch fast schon vermutet.

Ich werde jetzt einfach die Variante mit der Schleife nehmen... ich vermute ja auch irgendwie dass das irgendwas mit dem Timing zu tun hat oder irgendwas ... da sich die fehlerhafte ausgabe ändert, wenn der Ticker nebenher läuft. Also dann ist sie anders falsch. :D Aber so mit der Schleife gehts.

Danke trotzdem für die Mühen.

Andun