PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle schittstelle auslesen



yaro
21.05.2008, 12:56
hallo leute, ich habe einen "asuro"-Roboter und möchte mir auf den pc von ihm aus daten über die serielle schnittstelle rübersenden, was auch klappt, wenn ich sie per hyper-terminal auslese.
wie kann ich daten, die ich bekomme, auch direkt in ein anderes programm (in C) einlesen, um sie dort zu verwenden.
ich hab mich durch google gelesen, und bin dann auf die funktionen CreateFile, WriteFile und ReadFile gekommen. das schreiben mit ReadFile funktioniert, wenn auch sehr unzuverlässig (bekomme manchmal irgend son scheiß rüber), aber readFile funzt kein bisschen.

das ist der quelltext (währenddessen sende ich von meinem Roboter ununterbrochen "aaaaa..." aber er liest nix ein (read == 0)

#include <windows.h>

int main(int argc, char *argv[]){
HANDLE m_hPort;
DWORD read = 0;
char abb[2];

m_hPort = CreateFile( "COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

ReadFile(m_hPort, abb, 2, &read, NULL);

printf("%i\n",read);
printf("%s\n",abb);

system("PAUSE");
return 0;
}

yaro
21.05.2008, 18:04
ps. ich sende per infrarot an einen empfänger, der das dann weitersendet.

Ceos
21.05.2008, 18:41
das problem ist, um in naturbelassenem C einen com port VERNÜNFTIG zu initialisieren benötigst du alleine schon rund 50 zeilen code, ich rate dir auf www.c-plusplus.de/forum zu gehen und doert im WINAPI forum mal nach einer fertigen c-bibo zu suchen, ich perönlich habe mit C# angefangen um es mir einfacher zu machen ... iss wirklich einfacher, fast wie C++ nur ohne pointer und alles ist in packages verpackt, erinnert stark an java ^^ syntax is stark c++ ähnlich

yaro
22.05.2008, 13:52
thx, ich schau ma nach

yaro
22.05.2008, 17:41
so, hab mich jez durchgeklick und bin schließlich auf diese seite gelangt: http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503/
hab mich dann auch mit dem c++ code ganz gut auseinandergesetzt (kann eig. nur ansi c), sehr viel gebracht hat es aber nicht, wieder habe ich es geschafft irgendwelchen schrott zu senden (es kam vllt nur jedes 10te zeichen an, und das war dann auch nicht das, was ich eig. gesendet habe).
ich habe auch verschiedene frequenzen ausprobiert (sende beim hyperterminal mit 2400), hat aber nix geholfen =(
lesen will er garnicht....

das is der Quelltext meiner main:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "Serial.h"


using namespace std;

int main(int argc, char *argv[]){

CSerial serial;
if (serial.Open(1, 2400))
{
printf("%i\n",serial.ReadDataWaiting());
char lpBuffer[] = "aaaaaaaaaaaaaaa";
int nBytesRead = serial.ReadData(lpBuffer, sizeof(lpBuffer));
printf("%s", lpBuffer);
}
else
printf("Failed to open port!");


system("PAUSE");
return EXIT_SUCCESS;
}

er gibt mir für das ReadDataWaiting() 0 raus, und danach eben den unveränderten string

Martin.
22.05.2008, 18:10
Hallo yaro

ich hab mir comport von winsoft.sk runtergeladen. Es ist zwar nur ne demoversion aber dafür ist es leicht zu bedienen!

yaro
22.05.2008, 21:36
hab kein delphi, programmiere mit dev-cpp

Martin.
23.05.2008, 09:39
Keine ahnung ob dein post auf Comport bezogen war oder nicht.

Comport gibts jedenfalls auch für C++


available for Delphi 5, 6, 7, 2005, 2006, 2007 and C++ Builder 4, 5, 6, 2006

yaro
23.05.2008, 12:55
kann man damit live daten aus der schnittstelle rauslesen und in ein programm reintun?
am besten wär sowas wie das hyperterminal, dass mir einfach die ankommenden daten in eine datei schreibt. hyperterminal kann das auch, aba eben nicht live, erst wenn die verbindung getrennt ist

Ceos
23.05.2008, 13:21
mit der cserial bibo biste eigentlich ganz gut bedient ... wie testest du was du sendest/empfängst ?

EDIT: du solltest eine endlosschliefe machen, die regelmäßig prüft ob am port daten zur verfügung stehen ODER ob eine taste gedrückt wurde , damit könntest du erstmal eine echo eingabe simulieren indem du die sende und empfangsleitung vom com port verbindest

yaro
23.05.2008, 14:18
am port stehen keine daten zu verfügung, das is ja das prob...., hab mit ner funktion, die mir n kumpel gesagt hat überprüft, wieviel im buffer ist, da war 0 drin =)
vllt hats dran gelegen, dass ich mit 7 bit sende, ich hab imma auf 8 gestellt.

naja, hab jez n progg namens SeriKey! geladen, das überträgt den eingang der com-schittstelle direkt in die tastatureingabe, damit bin ich erstmal bedient. wäre trotzdem cool zu erfahren, wieso das andere denn nicht geht.
damit werd ich erstma mein jetztiges projekt (is für die schule) zuende machen, dann hab ich zeit mich mit dem anderen zu befassen

übrigens.....thx für die posts, hätte nicht gedacht, dass das so schnell geht

Ceos
23.05.2008, 16:34
na wenn du mit 7 bit sendest kommt am anderen ende wo 8bit erwartet werden auch nur mist raus!

probiere es einfach mal mit 8 datenbit und 2 stoppbits, das ist auch recht stabil so zumal die baudrate des senders mit dem empfänger stimmen muss .... baue einfach mal ne echoschleife!!! also tx und rx verbinden und dann die tastatur auslesen, senden und anshliessend empfangen

yaro
23.05.2008, 19:52
ok, werd ich machen (halte einfach n weißes blatt pappier vor den empfäger und sender, so hab ichs auch anfangs richtig eingestellt (mit hyperterminal)
mach das morgen, bin grad nicht zu Hause

Ceos
24.05.2008, 10:32
ahhhh ein asuuurrrroooo, gott ich bin blind ..... da brauchst 9600BAUD 8 datenbits 1(EIN, nicht ZWEI) stoppbits .... klar das du mit dem tranceiver nix empfangen konntest ^^

der weisse blatttest (schreibt man das mit 3 t ???) ist perfekt, mal eine endlossschleife



char letzetaste;
char letzeszeichen;
while(letztetaste != ESCAPETASTE) {
letzeszeichen = 0;
letzeszeichen = DeinSerialport.lesebyte(); // ich weis nicht mehr wie des ging, aber HIER darf das programm NICHT stehenbleiben
if (letzteszeichen != 0) zeichenausgeben();
if (keypressed()) {
letztetaste = getch();
DeinSerialport.schreibebyte(letztetaste);
}
}

return 0;


das ist nur pseudocode :p

yaro
25.05.2008, 20:08
sooo, hab das jez gemacht.....aber befridigend ist das ergebnis immernoch nicht! =)

das ist mein quellcode: (habe keine endlosschleife gemacht, sondern immer wieder das selbe zeichen gesendet)

if (serial.Open(1, 2400)){
int i,j;
char taste = 'a';

for(i = 0, j = 0; i < 50; j++, i++) {
char zeichen = 'z';
printf("\nnr.: %i", j);
serial.SendData(&taste, sizeof(taste));
printf("\ndata waiting: %i\n", serial.ReadDataWaiting());
serial.ReadData(&zeichen, sizeof(taste));
printf("zeichen: %c", zeichen);
printf("\n");
}
}
else
printf("Failed to open port!");

hab mit 2400 baud, 8 bit und einem stopbit gesendet (weil mein infrarot-sender so sicher funktioniert, verwende das auch im hyperterminal.)
und hier ist das merkwürdiger ergebniss:


nr.: 0
data waiting: 0
zeichen: z

nr.: 1
data waiting: 0
zeichen: z

nr.: 2
data waiting: 0
zeichen: z

nr.: 3
data waiting: 0
zeichen: z

nr.: 4
data waiting: 0
zeichen: z

nr.: 5
data waiting: 0
zeichen: z

nr.: 6
data waiting: 0
zeichen: z

nr.: 7
data waiting: 0
zeichen: z

nr.: 8
data waiting: 0
zeichen: z

nr.: 9
data waiting: 0
zeichen: z

nr.: 10
data waiting: 0
zeichen: z

nr.: 11
data waiting: 0
zeichen: z

nr.: 12
data waiting: 0
zeichen: z

nr.: 13
data waiting: 0
zeichen: z

nr.: 14
data waiting: 0
zeichen: z

nr.: 15
data waiting: 8
zeichen:

nr.: 16
data waiting: 7
zeichen: ■

nr.: 17
data waiting: 6
zeichen: о

nr.: 18
data waiting: 5
zeichen: м

nr.: 19
data waiting: 4
zeichen: м

nr.: 20
data waiting: 3
zeichen: м

nr.: 21
data waiting: 2
zeichen: м

nr.: 22
data waiting: 1
zeichen: м

nr.: 23
data waiting: 0
zeichen: z

nr.: 24
data waiting: 0
zeichen: z

nr.: 25
data waiting: 8
zeichen: м

nr.: 26
data waiting: 7
zeichen: м

nr.: 27
data waiting: 6
zeichen: м

nr.: 28
data waiting: 5
zeichen: м

nr.: 29
data waiting: 4
zeichen: м

nr.: 30
data waiting: 3
zeichen: м

nr.: 31
data waiting: 2
zeichen: м

nr.: 32
data waiting: 1
zeichen: м

nr.: 33
data waiting: 0
zeichen: z

nr.: 34
data waiting: 0
zeichen: z

nr.: 35
data waiting: 8
zeichen: м

nr.: 36
data waiting: 7
zeichen: м

nr.: 37
data waiting: 6
zeichen: м

nr.: 38
data waiting: 5
zeichen: м

nr.: 39
data waiting: 4
zeichen: м

nr.: 40
data waiting: 3
zeichen: м

nr.: 41
data waiting: 2
zeichen: м

nr.: 42
data waiting: 1
zeichen: м

nr.: 43
data waiting: 0
zeichen: z

nr.: 44
data waiting: 0
zeichen: z

nr.: 45
data waiting: 8
zeichen: м

nr.: 46
data waiting: 7
zeichen: м

nr.: 47
data waiting: 6
zeichen: м

nr.: 48
data waiting: 5
zeichen: м

nr.: 49
data waiting: 4
zeichen: м

manchma kam statt dem "m" auch ein "V"
ich kann mir das ehrlichgesagt nicht erklären....ich hoffe dass da jemand mehr ahnung hat als ich....=)

Ceos
26.05.2008, 10:37
erstens, bitte benutze die CODE tags, also vor dem code [ c o d e ] und dahinter [ / c o d e ] natürlich ohne leerzeichen

ausserdem hast du immernochnicht die BAUDRATE eingestellt!!!!!


if (serial.Open(1, 2400)){
sagt mir 2400 BAUD !!!!

der asuro sendet aber normalerweise auf 9600BAUD 8 Databit 1 Stoppbit!!!!!

yaro
26.05.2008, 15:33
mit 9600 gehts noch schlechter......da kommt noch mehr scheiß raus =)
müsste mit 2400 am besten gehen (empfange beim hyperterminal mit 2400 und bei diesem prog, dass ich runtergeladen habe auch mit 2400 (allerdings nit 7bit))
eigentlich wär es ja auch scheißegal, denn ich hab ja ne echo-schleife, bei der ich immer genauso sende, wie ich empfange...
ps. thx das mit den code-tags, hab das schon gesucht.

yaro
26.05.2008, 15:40
es scheint fast schon, als ob es erstmal anlaufen muss, denn nach dem 20. mal sendet er immer konstant (zwar nicht das richtige zeichen, aber konstant!)

wenn ich ein char array sende und empfange, dann funktioniert es garnicht...... wenn ReadDataWaiting() mehr als 0 anzeigt, dann scheint das array überhaupt keinen inhalt zu haben.

hab mal wieder versucht mit allen möglichen parametern vom asuro was zu senden und es am pc zu empfangen, hat aber nicht funktioniert, es kam absolut nix an.

Ceos
26.05.2008, 23:22
wie hast du das mit dem echo jetzt gemacht ? wenns weisses blatt iss, klingts nach schlecht eingestelltem empfänger, wenn anders gelöst, bitte beschreiben ^^

yaro
27.05.2008, 15:44
weißes blatt. aber eigentlich brauche ich nicht mal eins, der sendet das echo auch ohne blatt bei mir, der sender und empfänger sind ja direkt nebeneinander. der empfänger ist richtig eingestellt, sendet mir beim hyperterminal ja auch richtige zeichen. und dieses programm, das ich runtergeladen habe, um die eingänge vom com-port direkt an die tastatureingabe weiterzuleiten funktioniert ja auch.
vielleicht hat das mit der parität irgendeine bedeutung beim selbstgeschriebenen programm..............allerdigs kommt da dann wenigstens etwas an, auch wenn nur müll, bei mir kommt ja überhaupt nix an. das ist es, was mich so wundert, denn falsche sendelägen würden zwar die gesendete information verfälschen, aber es würde zumindest irgendetwas ankommen!

yaro
28.05.2008, 18:39
jaaaaaaaaaaaaaaaaaaaaaaaaa!!! es hat geklappt!!!!!!!!!!!!!!! es war die parität!!!!!!!!!! ich musste gerade parität einstellen, damits funktioniert, jetzt geht es einwandfrei!!!
danke für deine hilfe Ceos!!

Ceos
28.05.2008, 20:15
das freut ich zu hören ^^