Serielle Schnittstelle Visual C++ 6.0

nullplaner

Grünschnabel
Hallo,

also ich hatte das so verstanden:
ReadDataWaiting() gibt die Anzahl der Zeichen zurück, die im internen IN-Buffer liegen, ReadData() liest die Daten dann aus dem Buffer aus. Soweit stimmt also deine annahme.

Die serielle kommunikation funktioniert hier so, dass der gesamte Lese- und Schreibvorgang von internen Mechanismen ausgeführt werden. Das einzige was der Programmierer letztlich mit seinem Code (ReadFile(...) / WriteFile(...) ) macht, ist den internen Buffer auszulesen bzw zu füllen.

Was die Sache mit dem Pollen betrifft ist das wohl für viele Anwendungen eine ganz vernünftige Lösung. Die etwas kompliziertere ist einen eigenen Thread zu verwenden, der auf ein Event wartet, das eine Veränderung am ComPort anzeigt:
Code:
SetCommMask (hCom, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING);

WaitCommEvent(hCom, &dwCommModemStatus, 0);

Die ganzen Events sind in der Vc++ Hilfe unter "WaitCommEvent" zu finden.

Was die Sache mit Bluetooth angeht kann ich leider nicht weiterhelfen, das Thema interessiert mich aber auch, da ich damit in nächster Zeit wohl auch zu tun haben werde.
 

Mr_P1nk

Grünschnabel
danke für deine antwort

ich hab das empfangen der daten über bluetooth jez mal gelöst und werds einfach mal posten viell kanns ja wer brauchen.

grundsätzlich ist zu sagen das meine lösung sicher nicht die eleganteste ist und ich weiss auch nicht bis zu welcher dateigröße das ganze so funktioniert (bei meiner anwendung entstehen eigentl keine files >100kb). das problem bei meiner realisierung ist, dass das programm die ganze zeit in der schleife hängt bis daten kommen. falls es wenn interessiert ich habe auch eine klasse gefunden die das ganze besser löst, die ich aber aus zeitgründen nicht verwendet habe:CSerialPort
ich habe die klasse cFuchs verwendet, mit der kleinen änderung, dass ich bei der open methode noch den input buffer verändert habe:

Code:
SetupComm(m_hIDComDev,500000,16);
parameter 1 ist das handle, parameter 2 der input- und parameter 3 der output-buffer (jeweils in byte)

Code:
file = fopen(m_path, "w");
  BTRecv.Open(com, 9600);
  
  while(i == 0)  i = BTRecv.ReadDataWaiting();
  
  counter = 0;
  
   while(BTRecv.ReadDataWaiting() != 0) 
  {i = BTRecv.ReadData(sign, 100);
  counter += i;
  start = GetTickCount();
  while(GetTickCount() - start <= 10);
  for(j=0; j<i; j++) fputc(sign[j],file);
  }
  BTRecv.Close();
  fclose(file);

ich weiss auf den ersten blick schaut das ganze recht einfach aus (ist es im prinzip auch), aber ich hatte das problem, dass mein prog zu schnell aus dem buffer rausgelesen hat und bevor neue daten da waren sich schon beendet hat, da readdatawaiting 0 zurückgegeben hat, deshalb hab ich das delay eingebaut. für größere files hilft es viell wenn man sich mit dem limit bei readdata und dem delay herumspielt.

mfg mr pink
 
Zuletzt bearbeitet:

Banner83

Grünschnabel
Hallo,

weiß jemand von euch wie ich mit c/c++ die steuerleitung der seriellen Schnittstelle auslesen kann (0,1) und in abhängigkeit davon automatisch den Pc abschalten lassen kann?

Danke im Vorraus!
 

Banner83

Grünschnabel
hab ich vergessen zu sagen, das Programm soll unter Win98 laufen!
Es soll wenn logisch "1" auf der Steuerleitung der seriellen Schnittstelle anliegt automatisch runterfahren.

Danke im Vorraus
 

Flegmon

Erfahrenes Mitglied
@ciubic ich glaube nicht, dass er das mit USB machen wollte sondern übern den COM-Port.

Ich hab da auch mal was gemacht. Ich weiss noch, dass es da ne Windows Funktion gibt. Die dir das Abfragen von einem einzelnen ermöglicht. Mir fällt sie grade nich ein. Könnte auch sein, dass es in diesem Thread hier steht. Runterfahren ist auch nicht schwer. Bemühe einfach mal die Suchfunktion.
 

MortenV

Mitglied
Warum nutzt ihr nicht einfach das MS Communications Control als ActiveX Plugin für VS6 ?
Ich habe damit sehr einfach Zugriff auf die Daten meines Multimeters erhalten.
Ich habe mal einen VS6 Dialog mit MSCOMM-Sourcen angehängt. Vielleicht hilft es weiter. Das Ganze Projekt war zu groß für den Anhang.

Fragen ? Fragt !

Gruß Morten
 

Anhänge

  • comtest.zip
    5,4 KB · Aufrufe: 641
Zuletzt bearbeitet:

raiderfortwix

Grünschnabel
So nun hab ich auch das Problem mit der seriellen Schnittstelle. Hab eigentlich nur erfahrung in Visual Basic muss jetzt aber etwas in VC++ machen und steh dermassen daneben.

Ich möchte eigentlich nichts anderes als aus einer Dialogfeldbassierenden Anwendung im MFC die serielle Schnittstelle ansprechen und über die Menüleiste einmal Daten an die Serielle Schnittstelle schicke und über einen anderen Menüpunkt Daten von der Seriellen Empfangen sowie ein Menüpunkt die Einstellungen an de Com vornehmen.

Hab versucht mal ein Projekt zu generieren -> schlug fehl

Neues Projekt Diologfeldbasieren im MFC-Anwendungassisten erstellt.

die Serial.cpp und die Serial.h dem Projekt hinzugefügt.

Testserial.cpp - Datei hinzugefügt

kompiliert

folgende Fehlermeldung -> fatal error C1083: Include-Datei kann nicht geöffnet werden: 'Serial.h': No such file or directory

Das kann doch nicht so schwierig sein.

Hat den niemand ein funktionierendes Beispielprojekt das er hier reinhängen könnte da es ja dazu schon etliche Fragen gab.

Ich wäre ja bereit ein kleines Tutorial mit einer Stpb by Step anleitung zu schreiben so dass alle etwas davon haben sollten. Entwerde auf Basis VCPP 6.0 oder VC++2005.

Anhand eines luafähigen Beispiels könnte das einfacher gehen.
 
Zuletzt bearbeitet:

langer1801

Erfahrenes Mitglied
Hi,
die Fehlermeldung besagt doch, dass der Compiler die Datei nicht gefunden hat. Also solltest du mal schauen, wo die Datei "Serial.h" sich befindet. Sie muß sich im Projekt-Verzeichnis befinden (also wo auch die anderen .h und.cpp-Dateien. Und hast du die Dateien auch dem Projekt bekannt gemacht? Über Projekt->Vorhandenes Objekt hinzufügen? D.h., ist der Datei-Name im Projektmappen-Explorer zu sehen?
Danach sollte dieser Fehler nicht mehr auftreten und dann kannst du weitermachen.

Mfg

langer
 

SliderBOR

Grünschnabel
Hallo,

ich hab folgendes Problem:

Ich möchte auch eine Software schreiben, die über meinen Bluetooth-Adapter Daten senden kann. Später sollen Daten von einem Bluetooth-Modul auf einer Mikrocontroller-Schaltung empfangen und zum PC gesendet werden.
Habe ebenfalls die Serial-Klasse eingebunden und es gibt auch keine Fehlermeldungen, wenn ich einen Port öffne (Com 9, ist momentan meinem Handy zugeordnet, da ich das Modul noch nicht habe).
Was ich jetzt überhaupt nicht weiß ist, welches Bluetooth-Profil überhaupt von meinem Programm / der Serial-Klasse verwendet wird. Ist das das SPP (Serial Port Profile)?
Muss ich also immer erst mit der Software vom Bluetooth-Adapter das Gerät hinzufügen und kann dann mit meinem eigenen Programm senden/empfangen? Muss ich da sonst nichts weiter einrichten, festlegen, Verbindungen aufbauen, Handshake oder sonst was? Wäre ja fast zu einfach. :)
Hier nochmal mein Code, wäre gut, wenn mir jemand sagen könnte, ob das prinzipiell richtig ist:

Code:
#include "stdafx.h"
#include <windows.h>
#include "Serial.h"

int main()
{
	CSerial serial_port;
	char buffer;
	int bytes_written = 0;
	if(!serial_port.Open(9, 9600)) // virtueller COM-Port 9
	{
		printf("Fehler bem Oeffnen\n");
		return 0;
	}
	printf("Erfolgreich geoeffnet!\n");
	bytes_written = serial_port.SendData(buffer, 1); // Nur 1 Byte wird gesendet
	printf("%d Byte gesendet\n", bytes_written);
	serial_port.Close();
	return 0;
}