PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Relaisplatine mit c++ ansteuern



RaveKev
29.03.2005, 22:44
moin!

Ich hab mir für die Schule ein Projekt rausgesucht, bei dem ich mit C++ eine Relaisplatine ansteuern möchte.

Dafür habe ich mir die RELAISPLATINE 8-fach seriell von Conrad gekauft, und einen USB-Serial-Cable gekauft.

Da ich dieses Projekt mit meinem Laptop vorführen möchte, und ich daran keinen COM-Anschluss (RS232) habe, brauchte ich das Kabel, welches von USB auf COM geht.

Mit einem, der Relaiskarte beigefügten Programm, habe ich schon erfolgreich getestet, ob das mit dem USB überhaupt geht.


Jetzt muss ich nur noch in C++ ein Programm coden, welches die einzelnen Relais ansteuern soll.
Aber in dem Handbuch der Karte ist leider nur ein Beispiel für BASIC. Doch damit kann ich recht wenig anfangen.



Könnte mir bitte jemand sagen, wo ich die nötigen Funktionen und Header-Dateien und sonstiges finden kann, um mein Projekt zu realisieren?


vielen Dank schon mal im vorraus!

Matrix1000
03.05.2005, 07:22
Hi,

unter http://www.relaiskarte.thomas-dohl.de/
gibt nen C/C++ Programm.

RaveKev
03.05.2005, 18:21
vielen dank:D

werde gleich mal nachsehen

RaveKev
03.05.2005, 18:23
erm.. gibt es die programme auch für windows?
oder laufen die nur unter Linux?

Matrix1000
10.05.2005, 17:18
Also das o.g. Programm gibts nur für Linux.
Aber vielleicht läufts auch unter cygwin und dann damit
unter win.

RaveKev
10.05.2005, 19:41
okay muss ich mal testen..
aber kann ich gerade nicht machen, da ich letzte und diese Woche immer auf die Examen lernen muss.. (ProgTech[C++], InfoTech[Assambler], KommTech[DOS und Linux und NetWare] und ElektroTechnik[das wohl für mich schwierigste; elektronische Schaltungen... hatte heute im Examen bestimmt ne 5 geschrieben darin..] )

und bis nach den Ferien sollte ich mein Projekt (diese Relais ansteuerung) fertig haben.. mal sehen, wie es klappt...

ich such immernoch in jeder freien Minute im Netz nach so nem Programm, oder bessergesagt dem Code.. aber finde es einfach nicht.
Wo könnte ich denn noch danach suchen, als bei Google?

RaveKev
23.05.2005, 13:10
Also, ich habe jetzt diesen Code... aber irgendwie sendet er immernoch nicht..
Das Programm sagt mir zwar "Done..." aber meine RelaisPlatine macht nicht "Klick"....

Woran kann das liegen?



//#include <cstdlib>
#include <windows.h>
//#include <string.h>
//#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <dos.h>
//#include <stdlib.h>
#include <time.h>
#include <unistd.h>
//#include <string>




int main()
{

DCB dcb;
HANDLE hComm;
BOOL fSuccess;
char *pcCommPort = "COM2";

hComm = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);

if (hComm == INVALID_HANDLE_VALUE)
{
// Handle the error.
printf ("CreateFile failed with error %d.\n",
GetLastError());

}

// Build on the current configuration, and skip setting the size
// of the input and output buffers with SetupComm.

fSuccess = GetCommState(hComm, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("GetCommState failed with error %d.\n",
GetLastError());

}

// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.

dcb.BaudRate = CBR_9600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

fSuccess = SetCommState(hComm, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("SetCommState failed with error %d.\n",
GetLastError());

}
else
{
char frame[4];
frame[0] = 1;
frame[1] = 1;
frame[2] = 0;
frame[3] = static_cast<BYTE>(frame[0] ^ frame[1] ^ frame[2]);
DWORD dwBytesWritten = 0;
WriteFile(hComm, &frame, sizeof
(frame), &dwBytesWritten, NULL);
//TransmitCommChar(hComm,frame);
frame[0] = 3;
frame[1] = 1;
frame[2] = 5;
frame[3] = static_cast<BYTE>(frame[0] ^ frame[1] ^ frame[2]);

WriteFile(hComm, &frame, sizeof
(frame), &dwBytesWritten, NULL);
BOOL bResult;


DCB dcb_alt;
SetCommState(hComm, &dcb_alt);

bResult = CloseHandle(hComm);
hComm = INVALID_HANDLE_VALUE;
}

cout << "Done...";
cout << endl ;
getch();
return 0;
}

PicNick
23.05.2005, 13:46
Kollege, sizeof(frame) ist nur 1 , das reicht vielleicht nicht.
Wenn du alle 4 schicken willst, schreib "4" hin

RaveKev
23.05.2005, 15:25
Ich hab jetzt den Fehler rausgefunden...

Wie ich ja schon am Anfang gesagt habe, habe ich mir so ein Kabel von USB auf RS232 gekauft..

Jetzt habe ich das mal an dem PC meiner Mum ausprobiert, und dann da direkt an den RS232-Port gegangen. Da geht es.
Aber ich wollte es ja eigentlihc über den USB port machen, aber das kann ich mir dann wohl stecken..

Denn ich hab wie gesagt nur noch kurz Zeit (bis Mittwoch)..
Darum werde ich das jetzt einfach mal so lassen...

Denn ich konzentrier mich jetzt auf andere Sachen (Ob es geht, aus ner Tabelle oder Datenbank Informationen zu ziehen), und ein kleines GaragenTor mit Motor bauen.

Mein Dad programmiert FeuerWehrSoftware, und da sollte ich dann mein Programm mit einbinden..
Mein Programm wird dann von dem HauptProgramm aufgerufen, und als Übergabeparameter bekommt es dann eine FahrZeugNummer...
Mit Hilfe dieser Nummer wird mein Programm dann (wenn es funktioniert) aus der Tabelle raussuchen, in welchem Tor das jeweilige Fahrzeug steht, und dann das jeweilige Tor öfnen (dafür die RelaisKarten ansteuerung)

RaveKev
24.05.2005, 09:41
hmm.. also neues problem..
Wie oben funktioniert das Programm..
Aber wenn ich jetzt da ne AuswahlMöglichkeit reinbau, funktionierts nichtmehr..
(die fett gedruckten Teile sind neu. mit denen funktioniert es nichtmehr)


#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
#include <unistd.h>




int main()
{

int relais;
cout<<"\nBitte wählen sie das Relais aus: "
cin>>relais;



DCB dcb;
HANDLE hComm;
BOOL fSuccess;
char *pcCommPort = "COM3";

hComm = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);

if (hComm == INVALID_HANDLE_VALUE)
{
// Handle the error.
printf ("CreateFile failed with error %d.\n",
GetLastError());

}

// Build on the current configuration, and skip setting the size
// of the input and output buffers with SetupComm.

fSuccess = GetCommState(hComm, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("GetCommState failed with error %d.\n",
GetLastError());

}

// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.

dcb.BaudRate = CBR_19200; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

fSuccess = SetCommState(hComm, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("SetCommState failed with error %d.\n",
GetLastError());

}
else
{
char frame[4];
frame[0] = 1;
frame[1] = 1;
frame[2] = 0;
frame[3] = static_cast<BYTE>(frame[0] ^ frame[1] ^ frame[2]);
DWORD dwBytesWritten = 0;
WriteFile(hComm, &frame, (BYTE)frame, &dwBytesWritten, NULL);
//TransmitCommChar(hComm,frame);
frame[0] = 3;
frame[1] = 1;
frame[2] = relais;
frame[3] = static_cast<BYTE>(frame[0] ^ frame[1] ^ frame[2]);

WriteFile(hComm, &frame, (BYTE)frame, &dwBytesWritten, NULL);
BOOL bResult;


DCB dcb_alt;
SetCommState(hComm, &dcb_alt);

bResult = CloseHandle(hComm);
hComm = INVALID_HANDLE_VALUE;
};

cout << "Done...";
cout << endl ;
getch();
return 0;
}

RaveKev
24.05.2005, 12:10
Hab jetzt auch mal die Zuweisung für frame[2] wieder zurückgesetzt, also dass jetzt steht : frame[2]=3; aber dennoch oben die Abfrage nach dem Relais drinnen gelassen..
Wenn ich die Abfrage mit einbau, funktioniert das ganze Programm nicht.. also das Relais wird komischerweise nicht angesprochen, obwohl die Abfrage ( cout<<"\nBitte wählen sie das Relais aus: " ) ja nichts mehr mit dem Senden zu tun hat..

RaveKev
24.05.2005, 21:17
Ich hab jetzt das Problem gelöst...

Die Initialisierung von dem char relais muss global sein..
Also muss vor der main() schon char relais; stehen..

schon mal vielen Dank an euch, die mir weitergeholfen haben, und es versucht haben :D

ist echt ein gutes Forum