Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   daten von serieller Schnittstelle (https://www.delphipraxis.net/181057-daten-von-serieller-schnittstelle.html)

binderj1 11. Jul 2014 08:59

daten von serieller Schnittstelle
 
hallo

Ich versuche schon seit längerem daten (Winkelinformation 0 - 359) mit Delphi-7 einzulesen.
Die Date kommen von einem Arduino Uno über USB (com3).

Vacomm1.open;
label1.caption:=vacomm1.????


wie gehts weiter, oder was ist falsch.
gibts irgend wo einen Beispielcode.

Danke
mfG
Hannes

hathor 11. Jul 2014 09:03

AW: daten von serieller Schnittstelle
 
Schreibe es bitte richtig: Arduino Uno

Welchen Accelerometer hast Du?
Es gibt viele verschiedene ADXLxxx.

mkinzler 11. Jul 2014 09:05

AW: daten von serieller Schnittstelle
 
UJnd etwas mehr Informationen/Code. Was für Komponenten setzt Du ein?

himitsu 11. Jul 2014 09:28

AW: daten von serieller Schnittstelle
 
Erstmal kann es nie schaden, wenn auch verraten wird was man verwendet, vorallem wenn du keine delphieigene Komponente benutzt.

Ich vermute mal du meinst http://www.tmssoftware.com/site/async32.asp?s=history
Und diese Komponente hat bestimmt irgendwelche vacomm1.ReadIrgendwas-Methoden, welche in der Dokumentation zu finden sein sollen, oder die via Codevervollständigung aufgelistet würden.

binderj1 11. Jul 2014 16:51

AW: daten von serieller Schnittstelle
 
hallo
Zitat:

Zitat von hathor (Beitrag 1265160)
Schreibe es bitte richtig: Arduino Uno

Welchen Accelerometer hast Du?
Es gibt viele verschiedene ADXLxxx.

Ich verwende ein Potentiometer zur Winkelabfrage (analogwert)

Zitat:

Zitat von mkinzler (Beitrag 1265161)
UJnd etwas mehr Informationen/Code. Was für Komponenten setzt Du ein?

Ja richtig; ich verwende die TMS Async32 Komponente.



procedure TForm1.FormCreate(Sender: TObject);
begin

vacomm1.Open;
label1.Caption:= vacomm1.ReadText;

end;
end.


das einlesen funktioniert, aber es werden nur einige Werte gelesen, dann hört des einlesen auf und das ganze stockt und geht nicht mehr weiter. Der Arduino sendet die ganze Zeit die Winkelinformation (Werte zwischen 0 und 359).

binderj1 11. Jul 2014 16:55

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 41443

mkinzler 11. Jul 2014 17:00

AW: daten von serieller Schnittstelle
 
Du musst die Informationen in einer Schleife Pollen.

binderj1 11. Jul 2014 17:17

AW: daten von serieller Schnittstelle
 
Zitat:

Zitat von mkinzler (Beitrag 1265273)
Du musst die Informationen in einer Schleife Pollen.

hast du ein beispiel für mich? stehe voll am schlauch

mkinzler 11. Jul 2014 17:23

AW: daten von serieller Schnittstelle
 
Schau Dir das capture Beispiel, dass dabei ist.

himitsu 11. Jul 2014 17:24

AW: daten von serieller Schnittstelle
 
Hat die Componente vielleicht auch eine Art von OnData-Event?

(andere TComPort-Komponenten bieten ja auch sowas ... dort läuft dann im Hintergrund ein Thread, welcher immer mal wieder versucht Daten auszulesen und wenn etwas gelesen wurde, dann bekommt man das über ein Event mit)

mkinzler 11. Jul 2014 17:25

AW: daten von serieller Schnittstelle
 
Der Event heisst onRxChar

binderj1 11. Jul 2014 17:41

AW: daten von serieller Schnittstelle
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);

begin

  vacomm1.Open;

 end;




procedure TForm1.OnRxChar(Sender: TObject; Count: Integer);
   var
     s: string;
begin
 vaComm1.ReadChar(s, Count);
     label1.Caption:= s;

end;
so??

hathor 11. Jul 2014 18:18

AW: daten von serieller Schnittstelle
 
Brauchst Du nicht auch ein Programm für den ARDUINO als ADC?

Z.B.
Delphi-Quellcode:
// ADC

int ADC0=0;  
int value;
int LEDpin=13;


void setup()

  Serial.begin(9600);


void loop()

  value=analogRead(ADC0);
  Serial.print("ADC0 = ");
  Serial.println(value);
  delay(1000);
// alle nötigen Klammern entfernt - sind verwirrend...
Zum Testen: LED blinken lassen mit einstellbarer Frequenz durch Poti

Delphi-Quellcode:
// LED Blinkfrequenz über ADC einstellen

int ADC0=0;  
int value;
int LEDpin=13;


void setup()
//{
  pinMode(LEDpin,OUTPUT);
//}

void loop()
//{
  value=analogRead(ADC0);  
  digitalWrite(LEDpin, HIGH);
  delay(value);              
  digitalWrite(LEDpin, LOW);  
  delay(value);                
//}

binderj1 11. Jul 2014 18:58

AW: daten von serieller Schnittstelle
 
Delphi-Quellcode:
const int analogInPin = A0;
int sensorValue = 0;    
int winkel =0;
#include <LiquidCrystal.h>

 

LiquidCrystal lcd(12, 11, 6,5, 4, 3);

 

void setup() {
 
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
 
  sensorValue = analogRead(analogInPin);          
 
  winkel = sensorValue /2.841;
 
 delay (500)
 Serial.println(winkel);  

 
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Winkel = ");
lcd.print(winkel);

}
das ist das Arduino-Programm

hathor 12. Jul 2014 07:25

AW: daten von serieller Schnittstelle
 
Was zeigt das LCD an?

jensw_2000 12. Jul 2014 07:28

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von binderj1 (Beitrag 1265281)
Delphi-Quellcode:
procedure TForm1.OnRxChar(Sender: TObject; Count: Integer);
   var
     s: string;
begin
 vaComm1.ReadChar(s, Count);
     label1.Caption:= s;

end;
so??

Ne.
Du musst Dir einen Ringpuffer erstellen, an den die per ReadChar empfangenen Bytes angehängt werden.
Den Ringpuffer kannst Du dann auslesen und weiterverarbeiten (ausgeben, speichern, wasAuchImmer).

Ich hänge Dir mal ein XE2 DataModule an, das ich damals für einen Drehzahl Messplatz gebaut habe.
Für Delphi 6 wirst Du vermutlich einige Dinge anpassen müssen.
Dort verwendete ich die ComPort Library für die Serielle Kommunikation.

Es gibt sicher bessere Lösungen dafür. Schlechtere aber auch.
Das Prinzip sollte jedenfalls klar werden.
Schaue es den Code an und nimm, was Du davon verwenden möchtest.

binderj1 12. Jul 2014 10:07

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hathor (Beitrag 1265295)
was zeigt das lcd an?

Anhang 41448

binderj1 12. Jul 2014 10:13

AW: daten von serieller Schnittstelle
 
ich muss jetzt auf eine Hochzeit, am Montag mache ich wieder weiter.

Danke an alle die mir bis jetzt ihre Zeit geopfert haben.:-D

mfG
Johannes

himitsu 12. Jul 2014 10:52

AW: daten von serieller Schnittstelle
 
Diese ComPort-Komponente bietet nicht zufällig eine Möglichkeit an, die Daten zeilenweise auszulesen, oder bis zu einem definierbarem Stoppzeichen?

Man kann mantürlich die empfangenen Daten selber Cachen und an den Trennzeichen aufsplitten, um die Daten zu bekommen,
oder man lässt es automatischmachen.
Code:
Serial.println(...);
Trennt die einzelnen Werte ja mit einem Zeilenumbruch und an diesem kann man sie auch auftrennen.


PS: Man kann das ganze natürlich auch andersrum gestalten, indem das Arduino-Programm den aktuellen Wert nur auf Anfrage rausrückt,
oder zumindestens doppelte Werte weglässt. (z.B. nur bei Änderung "schnell" die Werte rausrückt und ansonsten längere Pausen lässt ... gibt weniger Probleme bei der Auswertung, da man bei einer Auslastung im PC nicht so schnell in ein Pufferüberlauf läut und auch so weniger "unnötige" Daten auswerten muß)

hathor 13. Jul 2014 13:49

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hier gibt es ein kostenloses Paket mit Sourcecode + Beispielprogrammen:
http://comport.sf.net/

Das MiniTerm-Programm passt perfekt zum ARDUINO.

binderj1 16. Jul 2014 20:06

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo
da bin ich wieder.

ich bin wohl zu blöd um das zu kapieren.
mit folgendem Prog. bekomme ich nur blöde Sonderzeichen (siehe Bild)Anhang 41464

im Mini Terminal läuft es aber richtig Anhang 41465

nur mein Prog streikt kann mir jemand weiter helfen.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VaClasses, VaComm, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    VaComm1: TVaComm;
    procedure FormCreate(Sender: TObject);
    procedure readCom3(Sender: TObject; Count: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
vacomm1.Open;

end;

procedure TForm1.readCom3(Sender: TObject; Count: Integer);
 var
 text: string;
 i: integer;

begin
 text:=vacomm1.readtext;
 label1.Caption:=text;
end;

end.

hathor 17. Jul 2014 06:27

AW: daten von serieller Schnittstelle
 
Richtiger COMPORT und andere Parameter richtig eingestellt?
Zeige den Code, wo das gemacht wird!

In procedure TForm1.FormCreate(Sender: TObject); steht nichts.
Da kannst Du es aber reinschreiben und die Parameter im Objectinspector überschreiben.

binderj1 18. Jul 2014 16:30

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo
Meiner Meinung nach habe ich den Comport richtig eingestellt (siehe Foto).Anhang 41476

Wie gibt man die Parameter der Com im Prog. an?

In der Zip-Datei ist mein Prog. vielleicht kann mir jemand weiter helfen.
Anhang 41480

binderj1 18. Jul 2014 16:57

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe ein Video von meinem Prog. gemacht, da sieht man wie die Zahlen "herumspringen" kann mir jemand sagen warum?Anhang 41483


Kann es sein, das mein Prog nicht ordentlich läuft weil ich eine Trial-Version von ASYNC32 verwende?

himitsu 18. Jul 2014 17:37

AW: daten von serieller Schnittstelle
 
Das wurde ganz am Anfang mehrfach ausführlich erklärt.

Der Comport, genauso wie bei TCP, bekommt am Ziel die Daten nicht genauso "partitioniert" rein, wie sie auf der anderen Seite versendet wurden.
Also mußt du selber unvollständige Daten sammeln und die empfangenen Daten auch selber (an den Zeilenumbrüchen) aufteilen.
ReadText weiß ja nicht wieviele Daten du lesen weillst, also liest es alles aus, was sich aktuell im Empfangspuffer befindet. (das können mehrere Zeilen und auch nur der Anfang der "letzen" Zeile sein)

hathor 18. Jul 2014 19:38

AW: daten von serieller Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
@binderj1:

Obwohl Du ziemlich therapieresistent bist,
will ich letztmalig helfen:

Im Anhang ist das Demoprogramm, das mitgeliefert wird!!!

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  VaComm1.Baudrate:= br9600; //anpassen <----------------------------------
  VaComm1.PortNum:= 7; //anpassen <----------------------------------------
  VaComm1.Open;
end;

jensw_2000 19. Jul 2014 10:23

AW: daten von serieller Schnittstelle
 
Ich hatte Dir sogar funktionierenden Quelltext für eine Ring-Puffer Klasse geschickt, die Dein Problem löst.
Zugegeben, die kleine Klasse war jetzt nicht übermäßig gut kommentiert, aber mit dem Stand, auf dem Du jetzt bist, hättest Du den Code leicht verstehen können. Irgendeine Antwort von Dir (danke/unbrauchbar/verstehe ich nicht/klappt nicht, weil..) hätte ich schon gut gefunden, wenn ich Dir fertige Arbeit schenke.
Stattdessen versuchst Du hier augenscheinlich so lange nachzufragen, bis Dir jemand Deine komplette Arbeit abnimmt.

Am einfachsten änderst Du Die Arduino Ausgabe so, dass statt des reinen Integers (Winkel) eine Format-Zeichenfolge ausgegeben wird. z.B. W217,.
Dann nimmst Du eine String Property, an dessen Wert Du alle empfangenen Daten vom Arduino einfach anhängst.
Anschließend wertest Du die String Property aus (beginnend vom Anfang des Strings) und schaust, ob dort ein "W<zahl>Komma" vorkommt. Falls ja, <zahl> ausgeben und den String von vorn bis zum letzten vorhandenen Komma abscheiden, falls nicht ... auf weitere Daten vom Arduino warten und wieder versuchen.
Alternativ schreibst Du Dir einfach eine kleine Ringpuffer Klasse, die alles für Dich erledigt. Beispiel hast Du ja.

himitsu 19. Jul 2014 11:01

AW: daten von serieller Schnittstelle
 
Und für fertige Lösungen gibt es hier sogar eine Abteilung, wo man seinen Arbeitsauftrag anbieten darf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz