MS Windows Borland C++ Builder V5 Serielle Schnittstelle

kiki_666

Grünschnabel
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:
Code:
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);

Mein Code auf dem Empfangs-PC:
Code:
com_status_h=Open_comport(port_nr, baudrate_dw);
bool empfangen=true;
while(empfangen)
{
  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;
  }
  if(rec_bytes_dw>0)
    empfangen=false;
}

...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
 
Flowcontrol (DTR/RTS) ausgeschaltet?
Was ist das bzw wo schalte ich das aus?
Und ja ich verwende ein NULL-Modemkabel. Und eine Verbindung bekomme ich auch hin. Habe mit einem Terminal (TeraTerm) eine Serielle Verbinudung über Com1 geöffnet und kann damit dann auch Daten (oder Dateien) von einem PC zum anderen senden.
 
Mittels der Flowcongroll kannst Du steuern, ob ein Sender Daten senden kann, oder weil z.B. der Empfänger den Empfangsbuffer nicht so schnell entleeren kann, das Aussenden stoppen will.
Hier ein Link wie die Flowcontroll bearbeitet werden kann
http://www.c-plus-plus-archiv.de/archiv/files/RS232.cpp

Ansonsten kann ich Dir für den BCB5-6 diese Komponentenlibrary
http://www.turbocontrol.com/APro.htm

empfehlen, die Dir jede Menge arbeit abnimmt
Gruß

Gerhard
 
Danke für deinen tipp, habe es soeben hinbekommen. Zumindestens mal ein Anfang. Kann jetzt ein Zeichen Senden und empfangen auch ein Zeichen (sogar dasselbe ;) ). Glaube also nicht, dass es am Flowcontroll gelegen hat.

Trotzdem danke für deine Hilfe

Thx kiki

PS: Die Komponentenlibrary hab ich mir trotzdem mal gespeichert. ;)
 
Hallo ich bins nochmal,

also die Kommunikation über die Serielle Schnittstelle habe ich vor einiger Zeit zum laufen gebracht. Daraufhin habe ich einige Tage einige andere Funktionen in meinem Programm erstellt. (die aber alle nichts mit meiner Seriellen Kommunikaion zutun hatten)
Seit ich jetzt mein Programm wieder verwenden will, funktioniert meine Kommunikation nicht mehr bzw. nicht mehr richtig. Ich werdende die Funktionen:

ReadFile (com_status_h, &InString, sizeof (InString), &dwRead, NULL);
WriteFile(com_status_h,&temp,length,&iBytesWritten,NULL);

Früher konnte ich in die Variable length einen Wert zwischen 1 und 23 schreiben und mit der Readfunktion habe ich genau diesen Wert dann in dwRead wiedergefunden.

Jetzt bleibt mein Programm aber solange bei der ReadFile bis ich die maximal Anzahl von Zeichen (also 23) empfangen habe. :(((

@GABehnke: Kann das Problem hier die Flowcontrol liegen? Wenn nein, eine Idee wo?

Gruß Kiki
 
Ich hab hier grad noch was mit Timeouts gefunden:

The SetCommTimeouts function specifies the communications time-outs for a port. To retrieve the current time-outs for a port, a program calls the GetCommTimeouts function. An applications should retrieve the communications time-outs before modifying them. This allows the application to set time-outs back to their original settings when it finishes with the port. Following is an example of setting new time-outs using SetCommTimeouts:

COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout = 20;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.ReadTotalTimeoutConstant = 100;
timeouts.WriteTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 100;

if (!SetCommTimeouts(hComm, &timeouts))
// Error setting time-outs.

Kann es sein dass es daran liegt? Also bin grad noch in der Testphase, aber es sieht so aus, als ob ich damit mein Problem beheben kann?
Ich frage mich nur, warum ich das früher nie machen musste?! Können sich solche timouts irgendwie von selber veränderd haben? (also ich kann mir des ja nicht vorstellen)
 
hallo,

ich muss ein prog schreiben, was daten über die serielle schnittstelle
leitet. es soll auf der einen seite daten von einem thermostaten
(julabo) empfangen und auf der anderen seiten wieder daten zurück
schicken.

also mit hilfe diverser codes habe ich es hinbekommen, dass er
erfolgreich ein port öffnet...

nun meine fragen:
- wie kann man software-seitig sicher gehen, daß auch wirklich ein gerät
an diesem port ist? kann man das irgend wie prüfen?


- wie genau müssen die daten aussehen, die ich sende?
in der anleitung des thermostaten steht, die "übertragung der zeichen
erfolgt gemäß din 66022 und din 66003, codetabelle 1".
das sagt mir nicht wirklich was .... :(
ich weiß nicht, ob ich die befehle in 'normalen' zeichen (a,b,c,..) oder
in den hex-codes senden muss. ausserdem ist mir rätzelhaft, wie ich den
string definieren muss (dword, char, ....)!?

kann mir vielleicht irgend jemand helfen?
 
Zurück