MS Windows Borland C++ builder V5 serielee Schnittstelle
-
Hallo Leute,
wie schon gesagt programmiere ich in Windows unter Borland C++ builder (Version 5).
Ich schreibe gerade ein Programm welches Daten über eine Serielle Schnittstelle an einem µC übergeben soll.
Zur Zeit gibt es allerdings den µC noch nicht und deshalb soll ich mein Programm mit meinem Programm selber testen:
Also mit 2 PCs, indem ich von einem PC Daten sende und beim anderen empfangen soll.
Ich dachte eigentlich dass alles funktioniert, aber leider sind die Daten die ich empfange leer! (glaube ich zumindest)Ich habe die vordefinierten Funktionen (die funktionieren und die ich auch verwenden sollte)
HANDLE Open_Comport(DWORD Comport, DWORD Baudrate);
int Close_Comport(HANDLE Driverhandle);
int Write_Comport(HANDLE Driverhandle, DWORD NumBytes, void *Buffer);
int Read_Comport(HANDLE Driverhandle, DWORD * BytesRead, DWORD Buffersize, void * Buffer, DWORD tout_dw);Mein Code auf dem Sende-PC:
HANDLE com_status_h;
DWORD baudrate_dw;
chrar port_nr=1;
char str[22];//...Beispiel Daten
str[0]='a';
str[1]='b';
str[2]='c';
str[4]='d';
laenge=4;com_status_h=Open_comport(port_nr, baudrate_dw);
Write_Comport(com_status_h,laenge,str);
[/code]Mein Code auf dem Empfangs-PC:
[code] com_status_h=Open_comport(port_nr, baudrate_dw); try { Read_Comport(com_status_h,&rec_bytes_dw,25,rec_bus_c,500); Memo->Lines->Add(TimeToStr(Time()) + "|" + rec_bus_c); // 09:33:28 | (-LEER-) } catch ( ... ) { throw; }...Und leider hab ich dann nur die aktuelle Zeit und den Strich aber keine Daten in meinem String! Und ich
habe überhaupt keine Idee wieso. Hab jetzt schon einige Möglichkeiten durchprobiert, aber nichts hab geholfen,
und deshalb hoffe ich jetzt auf eure Hilfe.Danke im vorraus
Kiki
-
Hi
du musst ReadComport in eine Schleife packen
corvin
-
jo des hab ich schon gemacht bzw probiert. Erst hab ich ne for-schleife 10 mal durchlaufen lassen und dannach hab ich ne While-Schleife genommen und ne Quasi-endlosschleife gemacht. Hat aber leider auch net funktioniert!
bool empfangen=true; while(empfangen) { Read-Comport(com_status_h,&rec_bytes_dw,25,rec_bus_c,500); if(rec_bytes_dw>0) empfangen=false; }
-
char* read() { unsigned char InString[COM_BUFFER_SIZE + 1] = ""; DWORD dwRead = 0; ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL); if (dwRead == 0) { InString[dwRead] = '\0'; return (char*)InString; } else { return "Keine Befehle erhalten"; } }teste mal das zum lesen
-
#include <windows.h> #include <conio.h> #include <ctype.h>
-
DCB dcb; hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); // setzen der Blocklaenge, muss erfolgen-------------------------- dcb.DCBlength = sizeof(DCB); // COM-Einstellungen laden---------------------------------------- GetCommState (hCom, &dcb); // Baudrate einstellen, hier 9600--------------------------------- dcb.BaudRate = 9600; // Datenbits einstellen, hier 8----------------------------------- dcb.ByteSize = 8; // Paritaet einstellen, hier keine Paritaet------------------------- dcb.Parity = NOPARITY; // Stopbits einstellen, hierv1------------------------------------ dcb.StopBits = ONESTOPBIT; // COM-Einstellungen speichern------------------------------------ SetCommState (hCom, &dcb); return 0;; } int close_com() { CloseHandle (hCom); return (0); }corvin
PS: weiss die quelle grad nich
-
Also ganzen Einstellungen wie Stopbit, Baudrate, Parity mache ich alle in der Open_comport-Funktion.
Meine Empfangs-Funktion sieht jetzt so aus:
int i=0; bool empfangen=true; //Port öffnen com_status_h = Open_Comport (portnr_c, baudrate_dw); if (com_status_h == 0) // error in opening port { StatusBar->Panels->Items[0]->Text = "COM "+AnsiString(itoa(portnr_c,s,10))+" failed to open !"; } else { StatusBar->Panels->Items[0]->Text = "COM "+AnsiString(itoa(portnr_c,s,10))+" successfully opened !"; open_com_b = true; // set flag that port is opened } char *test=new char; while(empfangen) { test=read(); i++; if(i==2000) empfangen=false; } Memo->Lines->Append(test.c_str()); Memo->Lines->Append(i); } ----------------------------------------- char* TBefehlsauswahl::read() { unsigned char InString[22 + 1] = ""; DWORD dwRead = 0; ReadFile (com_status_h, &InString, sizeof (InString), &dwRead, NULL); if (dwRead == 0) { InString[dwRead] = '\0'; return (char*)InString; } else { return "Keine Befehle erhalten"; } }
-
...aber irgendwas stimmt da wohl noch net ganz, da ich en Fehler bekomme.
(ich glaub ich hab irgendwo wa mit dem char * falsch gemacht)
-
...hab meinen Fehler glaub gefunden:
... char *test=read(); Memo->Lines->Append(test); ...Jetzt geht es zwar aber in Test steht immer X''C.
-
setze da mal einen breakpoint und schau dir die Variable als Hex-Zahl an
corvin
-
ist die hardware richtig????
corvin
-
Hardware?
Meinst du des Kabel? Wenn ja, des müsste schon des richtige sein. Ich kann über ein Terminal (TeraTerm) eine Verbindung über Com1 herstellen und auch Daten damit übertragen. Also daran dürfte es wohl nicht liegen.
Mir ist aber gerade etwas anderes aufgefallen:Die vorbefinierten Funktionen sind für BCB Version 3 geschreiben. Aber des dürfte ja eigentlich auch keine Probleme machen, da ich ja ne höhere Version habe.
...zu der Sache mit dem Breakpoint:
den kann ich zwar setzen, weiß allerdings nicht wo ich mir dann die Zahl als Hex-Wert anschauen kann. (habe noch nicht so viel Erfahrung mit BCB
)
-
Ok, ich auch noch nicht

Wert markieren -> Str+F5
in dem erscheinenden Fenster -> Doppelklick auf den Wert -> Hexadezimal auswählen -> OK klicken[EDIT] wegen dem Kabel, bei mir konnte nichts gesendet werden, weil der Sendepin auf dem anderen Sendepin sendet (un empfangen tu ich auf den Empfangspin)
corvin
-
[Edit] Falscher Code
corvin
-
Hex Wert:
empfangen=true
test= 00425D5FZu deinem anderen Prog: Ich wüßte nicht wie ich cout und cin ein einem BCB-Projekt benutzen kann. Ich bekomme zwar keine Fehler, aber es öffnet sich auch net das Standard Ein-Ausgabe-Fenster. Ich hab jetzt mal des ganze Prog von dir im Visual C++ (Version 6) gestartet. Ich hab auch keine Fehler, nur dass ich mit Esc net abrechen kann. Denke aber, dass da nur die Falsche Hexangabe das Prob ist.
Vielmehr stört mich, dass wenn ich mit dem Prog Buchstaben sende, auch nichts empfange. Für das Empfangen habe ich weiterhin meine BDB Programm genommen.
-
... noch ne andere Frage:
ist des normal, dass du iBytesWritten nichts zuweist?int send(unsigned char input) { DWORD iBytesWritten; /*<-------------HIER*/ // Variable für Sendezeichen------------------------------------- unsigned char ucMsg; ucMsg = input; WriteFile (hCom, &ucMsg, 1, &iBytesWritten, NULL); return (0); }
-
Schau mal in der Hilfe nach; ist ein Return-Wert
sry für den falschen code(da fehlt die empfangsroutine)
liefere ich aber nach;corvin
PS: der Code ist nicht von mir, nur bearbeitet
nicht zu viel von mir verlangen, bin erst u-16
-
ach so, das ist kein Hex-Wert der müsste etwa so aussehen:
0x3D
-
bist du sicher? Ich hatte auch was mit 0x erwartet. Aber des sind ja 4 Bytes (sind ja 4 char Elemente) die ich empfangen müste, von demher dachte ich dann schon, dass des mit 8Ziffern ok ist.
-
...so ich hab jetzt extra nochmal ein kleines Prog geschreiben, mit dem ich nur die Serielle Kommunikation testen kann. (davor war es einfach zu unübersichtlich) Und ich glaube jetzt funktioniert sogar die Übertragung. Leider nur noch nicht richtig. mit folgendem Programm:
#include <vcl.h> #pragma hdrstop #include "COM_PORT.h" #include <cstdlib> #include <windows.h> //fuer serielle Kommunikation #include <iostream> //fuer cout, cin #include <conio.h> //fuer Fkt. getch(), clrscr(); #include <ctype.h> //fuer toupper() #define COM_BUFFER_SIZE 16 // Read- und Write-Buffer-Size HANDLE hCom; //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int TForm1::open_com() { DCB dcb; hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); // setzen der Blocklaenge, muss erfolgen-------------------------- dcb.DCBlength = sizeof(DCB); // COM-Einstellungen laden---------------------------------------- GetCommState (hCom, &dcb); // Baudrate einstellen, hier 9600--------------------------------- dcb.BaudRate = 9600; // Datenbits einstellen, hier 8----------------------------------- dcb.ByteSize = 8; // Paritaet einstellen, hier keine Paritaet------------------------- dcb.Parity = NOPARITY; // Stopbits einstellen, hierv1------------------------------------ dcb.StopBits = ONESTOPBIT; // COM-Einstellungen speichern------------------------------------ SetCommState (hCom, &dcb); return 0;; } //--------------------------------------------------------------------------- int TForm1::close_com() { CloseHandle (hCom); return (0); } //--------------------------------------------------------------------------- int TForm1::send(char input) { DWORD iBytesWritten; // Variable für Sendezeichen------------------------------------- char ucMsg; ucMsg = input; WriteFile (hCom, &ucMsg, 1, &iBytesWritten, NULL); return (0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //Sende-Modus char taste; // Aufruf Funktion open_com()---------------------------------------- open_com(); // strcpy(taste,Edit1->Text.c_str()); //taste=Edit1->Text.c_str(); char a[20]=""; const char *p; p=Edit1->Text.c_str(); strcpy(a,p); Memo1->Lines->Add(a); send(taste); close_com(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //Empfangs-Modus Memo1->Lines->Add("Empfangsmodus"); Memo1->Lines->Add(TimeToStr(Time())); // Aufruf Funktion open_com()---------------------------------------- static int i=0; if(i==0) { open_com(); i++; } bool empfangen=true; char InString[22] = ""; InString[1]='a'; AnsiString zeit=TimeToStr(Time()); zeit=zeit.SubString(7,2); int zeit2=StrToInt(zeit); int zeit3=0; while(empfangen) { DWORD dwRead = 0; ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL); if (dwRead == 0) { InString[dwRead] = '\0'; //Memo1->Lines->Add(InString); } else { Memo1->Lines->Add(InString); empfangen=false; } AnsiString temp=TimeToStr(Time()); temp=temp.SubString(7,2); zeit3=StrToInt(temp); if(zeit2==zeit3-10) empfangen=false; //Memo1->Lines->Append(InString); } //Memo1->Lines->Append(InString); Memo1->Lines->Add(TimeToStr(Time())); Memo1->Lines->Add("Empfangsmodus beendet"); } //---------------------------------------------------------------------------stopt der Empfangsmodus wie gewollt und ich bekomme auch ein Zeichen auf dem Bildschirm ausgegeben. Leider ist es immer in "." egal ob ich ein "h" oder ein "a" sende.