- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: was mache ich falsch?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21

    was mache ich falsch?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:

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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21
    ich mache den quelltext gerade nochmal ein wenig übersichtlicher, sieht ja grauenhaft aus was ich da verzapft hab

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

    Code:
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.06.2004
    Ort
    Düsseldorf
    Alter
    39
    Beiträge
    158
    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.
    http://www.tappertzhofen.eu/bpp2

    Basic++ Programmiersprache
    für den C-Control I Mikrocontroller

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.06.2004
    Ort
    Düsseldorf
    Alter
    39
    Beiträge
    158
    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
    http://www.tappertzhofen.eu/bpp2

    Basic++ Programmiersprache
    für den C-Control I Mikrocontroller

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21
    nö kein ding

    Code:
    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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.06.2004
    Ort
    Düsseldorf
    Alter
    39
    Beiträge
    158
    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?
    http://www.tappertzhofen.eu/bpp2

    Basic++ Programmiersprache
    für den C-Control I Mikrocontroller

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21
    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....

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.06.2004
    Ort
    Düsseldorf
    Alter
    39
    Beiträge
    158
    Ne das sagt mir jetzt nix. Guck mal was passiert, wenn Du mit einem Terminal Programm (z.B. von der WorkBench) manuell sendest.
    http://www.tappertzhofen.eu/bpp2

    Basic++ Programmiersprache
    für den C-Control I Mikrocontroller

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2005
    Ort
    Waldems
    Beiträge
    21
    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?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress