PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : was mache ich falsch?



ferdisdot
26.12.2005, 22:46
Hallo an Alle.

ich habe ein kleines Problem bei der Kommunikation mit der CC über en Com-Port: Meine gesendeten Daten kommen völlig falsch und ohne erkennbares Muster wie zum Beispiel eine Verschiebung an.

Hier meine Programm das sendet:


### Zum Öffnen der Verbindung ####
procedure TForm1.Starten1Click(Sender: TObject);
var dcb: TDCB;
begin
BuildCommDCB('Com3: baud=9600 parity=N data=8 stop=1', dcb);
if dcb.BaudRate = 9600
then ShowMessage('OK');
Coms := true;
// if (OpenDevice(0) = 0) and (OpenDevice(1) = 1)
// then begin
Com1 := CreateFile(PChar('COM1'), Generic_Read or Generic_Write, 0, nil, Open_Existing, File_Attribute_Normal, 0);
Com3 := CreateFile(PChar('COM3'), Generic_Read or Generic_Write, 0, nil, Open_Existing, File_Attribute_Normal, 0);
Karteladen1.Enabled := false;
Thermikerzeugen1.Enabled := false;
Thermikladen1.Enabled := false;
Startpunktfestlegen1.Enabled := false;
Starten1.Enabled := false;
Pause1.Enabled := true;
Stop1.Enabled := true;
Timer1.Enabled := true;
Timer1Timer(Sender);
// end
// else ShowMessage('ERROR. Could not connect Interface');
end;

### Zum Sende der Daten ###
procedure TForm1.Timer1Timer(Sender: TObject);

procedure ActualizeValues;
var Data: Array[0..1] of Integer;
begin
OpenDevice(0);
ReadAllAnalog(Data[0], Data[1]);

end;

function CreateGPSMessage: String;
var GPSMessage, Temp: String;
begin
DecimalSeparator := '.';
GPSMessage := '$GPGGA,';
Temp := TimeToStr(Now);
while Pos(':', Temp) > 0
do Delete(Temp, Pos(':', Temp), 1);
GPSMessage := GPSMessage + Temp + ',';
GPSMessage := GPSMessage + IntToStr(Position.XPos.Deg) + IntToStr(Position.XPos.Min) + FormatFloat('#.0000', Position.XPos.Sec) + ',N,';
GPSMessage := GPSMessage + IntToStr(Position.YPos.Deg) + IntToStr(Position.YPos.Min) + FormatFloat('#.0000', Position.YPos.Sec) + ',E,1,04,2.7,';
GPSMessage := GPSMEssage + FormatFloat('#.0', Height) + ',M,32.5,M,,*FF';
DecimalSeparator := ',';
CreateGPSMessage := GPSMessage;
end;

procedure SendGPSMessage(GPSMessage: String);
var BytesWritten: Cardinal;
begin
WriteFile(Com3, GPSMessage, Length(GPSMessage), BytesWritten, nil);
if not(BytesWritten = Length(GPSMessage))
then ShowMessage('Error occured while transmitting GPS-Data');
end;

procedure WriteCompass(Course: Byte);
var BytesWritten: Cardinal;
begin
WriteFile(Com1, Course, 1, BytesWritten, nil);
if not(BytesWritten = 1)
then ShowMessage('Error occured while transmitting Compass-Data');
end;

procedure SimulateSensors;
begin
OpenDevice(0);
OutputAllAnalog(Round(Height/256), Round(Height) mod 256);
OpenDevice(1);
OutputAnalogChannel(1, 128);
end;

begin
ActualizeValues;
if Coms
then begin
SendGPSMessage(CreateGPSMessage);
WriteCompass(Round(Direction/360*255));
end;
SimulateSensors;
end;

Ich hoffe mal ihr könnt mir helfen. Schon mal danke
Ferdinand

Ich habe mal versucht mit der "Code" Funktion für das Programm die Darstellung etwas übersichtlicher zu machen. Manfred

ferdisdot
28.12.2005, 19:43
ich mache den quelltext gerade nochmal ein wenig übersichtlicher, sieht ja grauenhaft aus was ich da verzapft hab ;-)


### Zum Öffnen der Verbindung ####
procedure TForm1.Starten1Click(Sender: TObject);
var dcb: TDCB;
begin
BuildCommDCB('Com3: baud=9600 parity=N data=8 stop=1', dcb);
Com3 := CreateFile(PChar('COM3'), Generic_Read or Generic_Write, 0, nil, Open_Existing, File_Attribute_Normal, 0);
end;

### Zum Sende der Daten ###
procedure SendGPSMessage(GPSMessage: String);
var BytesWritten: Cardinal;
begin
WriteFile(Com3, GPSMessage, Length(GPSMessage), BytesWritten, nil);
if not(BytesWritten = Length(GPSMessage))
then ShowMessage('Error occured while transmitting GPS-Data');
end;

so jetzt ist nur noch das nötige drin sieht ein wenig übersichtlicher aus.

Auf der C-Control lese ich das ganz im Moment übrigens mit der Gunktion aus:


do
if rxd then
if counter < 32 then
get data
LCD_WRITE(20h, data)
Counter = counter + 1
end if
end if
loop until 1=0

Tappi
29.12.2005, 02:10
Du arbeitest mit BASIC++? Nimm doch mal das LCD Write weg und gib das ganze doch per RS232 oder LCD Objekt aus. Übrigens: Das ist ne Endlosschleife und wenn der Counter 32 erreicht hat (wird in der Schleife nicht mehr auf 0 gesetzt!) macht die Schleife nix anderes als sich im Kreis zu drehen.

ferdisdot
29.12.2005, 09:22
Hallo Tappi

Ja, istBasic++ also in der Workbench.ich denke das LCD_Write sollte kein Problem sein, das geht ja einfach über den I²C-Bus. Die Schleife soll vorerst auch einfach nurmal die erst 32 Zeichen anzeigen. Hatte das vorher anders und nach 32 Zeichen den Bildschirm gelerrt aber das hab ich erst mal weggelassen.

Wie ist das jetzt eigentlich wenn ich den Com-Port mit meinem Programm am Pc öffne: brauch ich da na synchrone oder ne asynchrone Verbindung?

Ferdinand

Tappi
29.12.2005, 12:03
Hallo,

ich will gucken ob das Problem vielleicht am BASIC++ Programm liegt. Würde es Dir was ausmachen das komplette Programm hier zu posten?

Gruß,

Stefan

ferdisdot
29.12.2005, 12:12
nö kein ding


OPTION CC2.0

Import "IIC_LCD_DRIVE.BAS" 'LCD-Treiber

Baud R9600
LCD_INIT()
Line1(6)
LCD_WRITE(20h, 53h)
LCD_WRITE(20h, 79h)
LCD_WRITE(20h, 73h)
LCD_WRITE(20h, 74h)
LCD_WRITE(20h, 65h)
LCD_WRITE(20h, 6Dh)
Line2(2)
LCD_WRITE(20h, 49h)
LCD_WRITE(20h, 6Eh)
LCD_WRITE(20h, 69h)
LCD_WRITE(20h, 74h)
LCD_WRITE(20h, 69h)
LCD_WRITE(20h, 61h)
LCD_WRITE(20h, 6Ch)
LCD_WRITE(20h, 69h)
LCD_WRITE(20h, 73h)
LCD_WRITE(20h, 61h)
LCD_WRITE(20h, 74h)
LCD_WRITE(20h, 69h)
LCD_WRITE(20h, 6Fh)
LCD_WRITE(20h, 6Eh)
Print "Sytem initalisert, bitte warten...."
pause 96
LCD_CLR()
Print "Daten können jetzt gesendet werde"

define data as byte
define counter as byte

counter = 0

do
if rxd then
if counter < 32 then
' LCD_CLR()
' counter = 0
' end if
get data
LCD_WRITE(20h, Data)
Counter = counter + 1
end if
end if
loop until 1=0

'-------- Print Hex-Value ----------
function WriteHexDigit(Digit as Byte)
if digit > 9 then
LCD_WRITE(20h, (55 + digit))
else
LCD_WRITE(20h, (48 + digit))
end if
end function

declare function PrintHex(Value as Byte)
function PrintHex(Value as Byte)
WriteHexDigit(Value / 10h)
WriteHexDigit(Value mod 10h)
end function
ich hoffe aml das hilft weiter aso die lcd_write function ist aus dem iic_lcd_treiber von conrad brauchst du den auch noch?

ich vermute nur das problem in meine delphi Quelltext bei den Eistellungen der seriellen Schnittstelle, denn senden von der CC ans Hyperterminal oder ans Worbench Terminal funzt bestens.

Tappi
29.12.2005, 12:27
Hallo,

ne als Entwickler von BASIC++ brauche ich nicht die Standard LIB's ;)

Also das heisst wenn Du manuell sendest über Hypertemineral oder so funktioniert das. Nur Dein Delphi Programm läuft nicht? Wenn Du das Delphi Programm ausführst und was sendest zeigt der Müll an, oder? Er zeigt aber auch nur was an, wenn Du tatsächlich sendest? Sendet Delphi das ganze denn als Unicode oder ASCII?

ferdisdot
29.12.2005, 12:38
Uuups, sorry ;)

also ich hab übers HyperTerminal noch nix gesendet, das mag das nit so wirklich, aber das was ich von der CC sende kommt da richtig an.

Unicode oder ASCII, das ist ne gut frage...
also ich machs über WriteFile aus der WindowsApi. Da steht leider nix von der Codierung. Oben steht auch di Fuktion die sendet ein mal der Komplette Timerblock und im nöchsten beitrag dann nur der teil der wirklich sendet. Hoffe das hilft dir....

Tappi
29.12.2005, 13:13
Ne das sagt mir jetzt nix. Guck mal was passiert, wenn Du mit einem Terminal Programm (z.B. von der WorkBench) manuell sendest.

ferdisdot
29.12.2005, 13:20
da pssiert nix aber es macht mir da auch nit den anschein als obs schickt.

Der Delphi-Zeichensatz


Die Delphi-Sprache verwendet den Unicode-Zeichensatz mit alphabetischen und alphanumerischen Unicode-Zeichen und Unterstrichen. Die Sprache unterscheidet nicht zwischen Groß- und Kleinschreibung. Das Leerzeichen und die ASCII-Steuerzeichen (ASCII 0 bis 31 einschließlich ASCII 13 für Zeilenvorschub) werden als Blanks bezeichnet.

Kombinationen, die sich aus den grundlegenden syntaktischen Elementen (den so genannten Token) zusammensetzen, ergeben Ausdrücke, Deklarationen und Anweisungen. Eine Anweisung beschreibt eine algorithmische Aktion, die innerhalb eines Programms ausgeführt werden kann. Ein Ausdruck ist eine syntaktische Einheit, die in einer Anweisung enthalten ist und einen Wert beschreibt. Eine Deklaration definiert einen Bezeichner (z. B. den Namen einer Funktion oder Variablen), der in Ausdrücken und Anweisungen verwendet wird. Sie weist dem Bezeichner bei Bedarf auch Speicherplatz zu.

wenn ich das richtig duete dann sind meine strings alle in unicode das wird dann das problem sein oder?
Ich könnte nen ANSI-String nehemn ist das dann nen unterschied zu nem ASCII-String? ich glaube nit oder?

Tappi
29.12.2005, 13:28
Uni Code sind immer zwei Byte pro Zeichen. ANSI String müsste gehen.

ferdisdot
29.12.2005, 13:36
danke werde das gleich mal testen

Dierk
03.01.2006, 12:26
Hi,
probier doch mal nachfolgendes aus:


### Zum Sende der Daten ###
procedure SendGPSMessage(GPSMessage: String);
var BytesWritten: Cardinal;
begin
if not WriteFile(ComFile, GPSMessage[1], Length(GPSMessage), BytesWritten, Nil) then
ShowMessage('Error occured while transmitting GPS-Data');
if not(BytesWritten = Length(GPSMessage)) then
ShowMessage('Error occured while transmitting GPS-Data');

end;

Bei WriteFile muss der Offset 1 vom String, also GPSMessage[1] zur Referenzierung übergebn werden.

ferdisdot
04.01.2006, 21:10
So,
ich habe jetzt beides ein wenig ausprobiert aber leider ohne erfolg. Wie ist das eigentlich mit dem Startbit bei der konfiguration der seriellen Schnittstelle? Ih habe noch keine möglichkeit gefunden das einzustellen. Ist das Standard?

Vielleicht hier nochmal das Codfragment in dem ich die serielle Schnittstelle öffne:

Com3 := CreateFile(PChar('COM3'), Generic_Read or Generic_Write, 0, nil, Open_Existing, File_Attribute_Normal, 0);

Ich hab gerade nochmal die Nachricht in der Form mit ausgeben lassen, die sieht gut aus.

Nochmal danke für eure bisherige Hilfe
Ferdinand

ferdisdot
06.01.2006, 22:01
Hallo.

Ich weiss nicht wieso und warum, seit ich versucht habe eine datei über die Dos-Eingabeaufforderung zu senden funktioniert alles einwandfrei.

Danke für eure Hilfe.
Ferdinand