PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rs232 abfragen



bluna
15.12.2005, 13:56
hallo zusammen,
ich hoffe und denke ihr könnt mir helfen.
ich habe hier viele freundliche antworten gelesen, und mich deswegen gleich einmal hier angemeldet, da ich denke ihr könnt mir die richtigen denkanstösse und seitentipps geben.
vielleicht sogar nen code :)

so dann fang ich mal an. ich habe vor ein c programm zu schreiben.
mit diesem programm will ich abfragen ob ein knopf an der rs232 schnittstelle gedrückt wurde.
also eine reine ja nein abfrage.

die schnittstelle soll alle secunde abgefragt werden (signal liegt 3 secunden lang an), und dann soll eine phpseite ausgeführt werden.
wenn aber die 2 secunden davor die taste schon gedrückt wurde, sollte diese seite nicht aufgerufen werden.(falls schalter prellt oder auch der user 2 mal drückt)

leider finde ich nichts zu c und rs232 das mir mit meinem wissen weiterhilft. ixch finde nur vb codes :(

also nochmal in kurzfassung:
1. alle secunde abfragen, vorangegangenen zustand mit beachten.
2. php- aufrufen

ich hoffe ihr könnt mir da helfen.

vielen dank und
grüsse
bluna

Björn
15.12.2005, 14:44
Hi!

Muss es denn C sein - Wie du schon sagtest, ist die Sache in Visual Basic ein Kinderspiel! Das bekommt man auch in diversen Büchern sehr günstig als Autorenversion.

Gruß, Björn

bluna
15.12.2005, 14:56
hallo.
ich habe leider ein gewisses grundwissen in c, aber leider habe ich von vb keinen plan.
das macht die sache für mich noch schwerer.
zumindest müsste ich mich mit allen randbedingungen ..compiler.etc.. erneut beschäftigen und im falle eines fehler, hätte ich garkeine ahnung wie ich vorgehen muss, bzw. wo der feheler ist.
wenn natürlich ein funktionierendes script vorhanden wäre, wäre dieser "aufwand" günstig.
ich denke mal in c dürft das auch nicht so schwer sein oder?

.. also ich bin gerade am weiterinformieren, falls ich etwas habe , was wie ein ansatz klingt, poste ich diesen mal.

aber falls jemand mich unterstützen will mit codeauszugen .. gerne :)

NumberFive
16.12.2005, 08:07
Welches C oder doch vielleicht C++ ?
Weches betriebssystem ?
Wo hängt das signal dran an einer Signalleitung der RS232 ?

Wenn windoofs:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/waitcommevent.asp

Habe die RS232 schon öfters per C++ Programmier unter windows ok die signalleitungen habe mich nocht nicht interresiert aber so schwer sollte das nicht sein.

Gruß

bluna
16.12.2005, 09:52
guten morgen.

also mein signal hängt an der com1-DTR . es ist also nur ground und dtr belegt.

und ich wollte mit cpp programmieren.

ich schau mir mal den waitcommevet nun an.




#include<iostream>
#include <stdio.h>
#include<windows.h>
#include<conio.h>
#include<dos.h>
using namespace std;

void main (void)
{


HANDLE hCom = CreateFile( "com1", GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL);

start:

char lpByte [12];
BOOL len = 1 ;

DWORD dwBytesRecive ;

ReadFile(hCom, &lpByte, len, &dwBytesRecive, NULL);


printf("%d ",dwBytesRecive);

goto start;

CloseHandle(hCOM);
return 0;
}




ich bekomm ohne ende nullen angezeigt, aber wenn ich was drücke, wird leider keine andere zahl angezeigt.

"terminal" ist ein programm, das dtr ausgibt , wenn es gedrückt wurde.

wenn ich also meinen taster drücke, wird mein dtr signal auch angezeigt aber leider erscheint sogut wie immer eine null. das wundert mich. wenn man aber hektisch drückt, werden auch einmal andere zahlen angezeigt.
warscheinlich durch prelllen des tasters.
was müsste ich den normalerweisse bekommen wenn ich plus auf mein dtr lege?? ist der pegel zu schwach?

NumberFive
16.12.2005, 10:07
Guten Morgen,

Klar das du da nur 0len bekommst du liest daten und nicht Signalleitungen !
das wenn du Hectisch drückst mal was anders kommt häng sicher damit zu sammen das dann die Offene RX leitunge irgendet was interpretiert.

Auserdem dürfe den Prg den rechenr ordenlich beschäftigen oder ?

Ausdem kannst du DTR nicht nehmen da das intern verarbeitet wird nimm
mal DSR dann die Readzeile durch folgende zeile ersetzen.

WaitCommEvent(hCom,EV_DSR,NULL);

Vorsicht das Programm Hängt jetzt an der Stelle solange bis der Signal wechels kommt.

Gruß

bluna
16.12.2005, 10:53
danke für deine erklärung, ich werde den schalter nocheinmal neu löten.
wiso sollte das prog den pc schädigen?

ich melde mich später mit neuem schalter nocheinmal.
gruss

NumberFive
16.12.2005, 15:45
nicht schädigen beschäfigen weil dein endlos loop wohl 100 % Cpu last erzeugen dürfte ausdem wird das Close Com nie auf gerufen.

Gruß

bluna
19.12.2005, 11:22
hallo.
achso, sorry fürs verlesen. jetzt versteh ich was du meinst, du hast natürlich recht. deine lösung ist beiweitem besser als meine schleife :P
nun habe ich den neu gelöteten schalter.
also wenn nun der taster gedrückt wird, wird ein signal von dtr nach dsr durchgeschleust.
also da der pc sowiso ready ist, wird dann ein modem ready hergestellt.

soweit die theorie.
mit meinem programm terminal kann ich aber leider keine funktion feststellen. com error...? hm.. ich glaube der mann hat sich verlötet, gleich nochmal hinschlappen...

und mein programm läuft egal ob mit oder ohne schalter einfach am waitcommevent vorbei.. also ob er da nicht warten will :P

kannst du mir helfen?





#include <iostream>

#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <dos.h>
#include <unistd.h>
using namespace std;

int main(void)
{
HANDLE hCOM = CreateFile ("COM1",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
int anzahl=0;

//////////////////////////////
start:

char lpByte[12];
BOOL len=1;
DWORD dwBytesRecive, EVDSR;


//////////////////////////////
//warteschelife - damit das signal nicht gleich 2 mal abgegriffen wird
printf("Bitte warten!...");
Sleep(2000);
printf("...Weiter.");
//warteschleife ende
//////////////////////////////


//////////////////////////////
//ReadFile(hCOM, &lpByte,len,&dwBytesRecive,NULL);
cout << "" <<endl;
cout <<"------------------------"<<endl;
cout <<"Auf Signal warten."<<endl;
WaitCommEvent(hCOM,&EVDSR,NULL);
cout <<"Signal erhalten."<<endl;
cout <<"------------------------"<<endl;
cout << "" <<endl;
cout << "" <<endl;
printf("%d",dwBytesRecive);
cout << "" <<endl;
cout << "" <<endl;
//////////////////////////////


//////////////////////////////
//datei oeffnen


//funktioniert
cout <<"Increment wird geoeffnet."<<endl;
cout <<"------------------------"<<endl;
system("d:\\Dev-Cpp\\Examples\\inc.bat");
cout <<"------------------------"<<endl;
cout <<"Increment beendet."<<endl;
//datei oeffnen ende
//////////////////////////////

//////////////////////////////
++anzahl;
cout << "" <<endl;
cout << "" <<endl;
printf("Es wurde ");
printf("%d",anzahl);
printf(" mal Incrementiert.");
cout << "" <<endl;
cout << "" <<endl;
//////////////////////////////

cout << "****************************" <<endl;
cout << "" <<endl;

getch();
goto start;
//////////////////////////////

CloseHandle(hCOM);
return 0;
}

bluna
19.12.2005, 12:55
ok, der schalter geht nun. ich bekomme dsr mit meinem programm terminal nun angezeigt.

das einzigste problem das ich noch hätte , ist dass mein programm am waitcommevent vorbeiläuft :( bis zum getch();

NumberFive
19.12.2005, 13:52
Mit nicht initaliesieren Variabelen zu schaffen ist nicht gut.
und zweites habe auf die Schnelle was übersehen gehabt sorry

DWORD dwBytesRecive, dwEvtMask;
....
SetCommMask(hCom, EV_DSR);
...
WaitCommEvent(hCOM,&dwEvtMask,NULL);
if (dwEvtMask & EV_DSR)
{
....
}

EV_DSR: Ist ein Konstane

Gruß
PS: Sorry für den Fehler

bluna
19.12.2005, 14:43
ich danke dir für deine hartnäckiges hilfe :) bin froh genug dass du mir hilfst, brauchst dich nicht entschuldigen.
ich habe auch viel gelesen, aber darauf bin ich selbst nich gekommen :(

ich hab aber noch immer ein problem.
es stoppt nun zwar an dem befehl, aber leider kann ich durch den tatsendruck das programm nicht vortsetzten.

wenn ich am programm terminal das signal überprüfen will, muss ich dtr anhacken, und dann signalisiert er mir dass mit dem tastendruck dsr funktioniert. wenn ich dtr nicht anhacke, signalisiert er mir das nicht.
ich denke das passt so schon.

muss ich im programm auch das dtr setzten?

weil ich ja auch dtr nach dsr durchschalte.

vielleicht sollte ich noch cts auf masse setzten?

Vitis
19.12.2005, 14:43
also, es wird keine php-seite ausgeführt,
sondern ein php-script aufgerufen.
Zur Erklärung: php ist kein (!) Programm wie
exe oder com - Dateien
du brauchst dann n server, auf dem das script liegt und
auf dem es auch geparst wird.
der server kann das eigene system sein oder ein rechner
irgendwo im www, nur erreichbar muß er halt sein und
php interpretieren können. n reiner html-server reicht da nicht.
gängigste kombination ist apache server mit php und mysql

ausserdem würd ich die variante controller am com-port favorisieren,
da man dann deutlich mehr möglichkeiten hat und kein morsen erlernen
muß.

darf man fragen was das am ende werden soll?

bluna
19.12.2005, 14:52
klar darfst du.

also mit php und webserver kenn ich mich eigentlich gut aus im gegensatz zu c++ wie man sieht :)

also ich hab eine datenbank apllikation geschrieben mit php und das lauft auf einem apache ws (xampp light) und kommuniziert mit einer oracle datenbank.

die php oberfläche hat mehrere logins um einstellungen vorzunehmen.

jetzt sollen an verschiedenen pcs knöpfe angebracht werden, die eine kleines php script aufrufen (durch knopf-druck) und dann schreibt dieses script in die datenbank. der knopf dient sozusagen als stückzähler.

deswegen das problem mit meinem knopf.
wie man oben sieht, kann schon wunderbar die batch datei aufgerufen werden nur am knopf haperts noch.

was genau meinst du mit dem comport controller? interbus oder lightbus o.ä.?

NumberFive
19.12.2005, 16:07
Also für einen Normalen Taster brauchst du keinen Controller in meinen Augen. Natürlich ist der Sleep im moment nicht so klasse aber das mach jetzt noch nix. Ja du muß da auch dtr setzen wenn du das signal verwendest es kann ja sein das befor dein prg gestartet wir die Schnistelle in einem ander status ist. damit es sicher klappt also immer erst alles setzen.

h = CreateFile(path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (h == INVALID_HANDLE_VALUE) {
logprintf(MLOG_ERROR, "Cannot open PTT device \"%s\"\n", path);
return -1;
}
res = DeviceIoControl(h, IOCTL_SERIAL_CLR_RTS, NULL, 0, NULL, 0, &val, NULL);
if (!res) {
logprintf(MLOG_ERROR, "Device \"%s\" not a serport\n", path);
CloseHandle(h);
return -1;
}

Damit sollte man die Leitungen setzen können aber mal ganz ehrlich das habe ich auch noch nicht probiert das ist lovel zugriff auf den comport treiber. Und der Source nicht vom mir:

http://cvs.berlios.de/cgi-bin/viewcvs.cgi/ofdm/soundmodem/soundcard/winptt.c?rev=HEAD

Gruß

NumberFive
20.12.2005, 07:48
Hallo bluna,

warum mit php auf die Oracle ?
Warum mehr als ein Session ?

Programiere den ganzen Tag mit C++ und Oracle 8/9/10 viel PL/Sql und sql.
Betreue ein große Software auf der Oracle aber wir brauchen nicht mehr als ein Session von prinzip her.

Warum schreibts du den tasten druck direckt in die Oracle wenn du ihn da brauchst. Wenn es dir möglich ist kannst du ja mal das Endziel etwas genauer beschreiben.

Gruß

bluna
20.12.2005, 08:45
ok also es werden an verschiedenen bänder (in der produktion)
pcs stehen, diese pcs dienen als anzeige (andon) und als signalnehmer (taster).

die schichtvorgabe und andere eingaben wie soll-stückzahlen werden über eine php oberfläche eingegeben.
die istzahl wird dann über den taster incrementiert.

php- zwecks leicht einschaubarer und erweiterbarer code und andere gründe...

jetzt steht nunmal schon die php-oberfläche und dann dachte ich mir bevor ich diese in c nochmals schreibe (dort kenne ich mich sowiso nicht so prickelnd aus) rufe ich über eine bat datei meine php seite auf.

diese "increment.php" erkennt dann welcher taster an welchem band gedrückt wurde und schreibt in die datenbank an der richtigen stelle für das richtige produkt.


das mit dem sleep ist kein problem, da ungefähr allle 5 minuten (schätzung :) ) ein produkt vom band läuft und somit der rechner nicht sehr viel zu tun hat. ausser anzeigen.

achso hab noch vergessen, dass mit php und kiosk mode natürlich auch am band selbst verschiedene statistiken ausgegeben werden. für die mitarbeiter.

also ich werde mich nun nochmals reinstürzen, ich hoffe ich schaffe dies noch diese woche, dann bin ich relativ gut im zeitplan. weil dann die testphase anlaufen sollte.

NumberFive
20.12.2005, 08:54
Na gerade dann wenn es an dem PC einen User gibt würde ich es anders mach Ok bin C++ Programierer und schaffe den ganzen tag mit Windoofs.

Ich würde aus der RS232 Software ein dienst machen (Keine Benutzeroberfläche) und direckt in die DB schreiben.

Wenn die jungs und mädels raus bekommen das man sein werte erhöt wenn man auf die datei click werden sie es tun.

Das riecht alles nämlich nach leistungserfassung für Acord arbeit.

Was sind das für Rechner (Betriebssystem) auf den die erfassung laufen soll ?

Gruß

bluna
20.12.2005, 09:21
also die rechner sind xp rechner, in denen nur die anzeige (kiosk mode ohne alt f4 kommt man nicht raus) läuft ohne maus und ohne tastatur.
also rmotezugriff.

also vor zugriff der user geschützt

ausserdem kann auch die taste öfters gedrückt werden, und somit ist dann ein verfälschen der daten auch möglich.
wenn aber am schichtende zuwenig produziert wurde, fällt das schon auf, also ist schon eine absicherung gegeben.

wenn ich mich mit c++ besser auskennen würde, würde ich das evtl auch anders realisieren, aber die zeit rennt und dies lösung ist durchaus eine gute lösung denke ich.

ich hab schon genug probleme mit diesem scheiss hier :( ich komme schonwieder nicht weiter..

falls du lust hast ... :) ich probier nochmals ein wenig rum.
gruss


[edit] hättest du das anders gelötet??

NumberFive
20.12.2005, 09:25
wo ist das problem ? habe zwar eigendlich kein Zeit aber ich werde gucken.
hast du ICQ ?

Soll ich meine Aufmachen ?

Gruß

PS: Ich will nicht das du Weihnachten arbeiten mußt *g*

bluna
20.12.2005, 09:37
:) danke , aber hier habe ich kein icq. leider.
evtl. abends?

mit dem hier kann ich nichts anfangen: IOCTL_SERIAL_CLR_RTS

aber ich bin kräftig am googlen

NumberFive
20.12.2005, 09:48
Ist eine Konstante

Defined in ntddser.h. Include ntddser.h.

http://www.sysinternals.com/Utilities/Portmon.html
Hier mit kanst du mit hören was dein Comport so mach for allem was das Terminal prg so tut.



#define IOCTL_SERIAL_SET_BAUD_RATE CTL_CODE(FILE_DEVICE_SERIAL_PORT, 1,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_QUEUE_SIZE CTL_CODE(FILE_DEVICE_SERIAL_PORT, 2,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_LINE_CONTROL CTL_CODE(FILE_DEVICE_SERIAL_PORT, 3,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_BREAK_ON CTL_CODE(FILE_DEVICE_SERIAL_PORT, 4,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_BREAK_OFF CTL_CODE(FILE_DEVICE_SERIAL_PORT, 5,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_IMMEDIATE_CHAR CTL_CODE(FILE_DEVICE_SERIAL_PORT, 6,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_TIMEOUTS CTL_CODE(FILE_DEVICE_SERIAL_PORT, 7,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_TIMEOUTS CTL_CODE(FILE_DEVICE_SERIAL_PORT, 8,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_DTR CTL_CODE(FILE_DEVICE_SERIAL_PORT, 9,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_CLR_DTR CTL_CODE(FILE_DEVICE_SERIAL_PORT,10,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_RESET_DEVICE CTL_CODE(FILE_DEVICE_SERIAL_PORT,11,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_RTS CTL_CODE(FILE_DEVICE_SERIAL_PORT,12,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_CLR_RTS CTL_CODE(FILE_DEVICE_SERIAL_PORT,13,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_XOFF CTL_CODE(FILE_DEVICE_SERIAL_PORT,14,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_XON CTL_CODE(FILE_DEVICE_SERIAL_PORT,15,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_WAIT_MASK CTL_CODE(FILE_DEVICE_SERIAL_PORT,16,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_WAIT_MASK CTL_CODE(FILE_DEVICE_SERIAL_PORT,17,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_WAIT_ON_MASK CTL_CODE(FILE_DEVICE_SERIAL_PORT,18,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_PURGE CTL_CODE(FILE_DEVICE_SERIAL_PORT,19,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_BAUD_RATE CTL_CODE(FILE_DEVICE_SERIAL_PORT,20,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_LINE_CONTROL CTL_CODE(FILE_DEVICE_SERIAL_PORT,21,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_CHARS CTL_CODE(FILE_DEVICE_SERIAL_PORT,22,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_CHARS CTL_CODE(FILE_DEVICE_SERIAL_PORT,23,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_HANDFLOW CTL_CODE(FILE_DEVICE_SERIAL_PORT,24,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_HANDFLOW CTL_CODE(FILE_DEVICE_SERIAL_PORT,25,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_MODEMSTATUS CTL_CODE(FILE_DEVICE_SERIAL_PORT,26,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_COMMSTATUS CTL_CODE(FILE_DEVICE_SERIAL_PORT,27,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_XOFF_COUNTER CTL_CODE(FILE_DEVICE_SERIAL_PORT,28,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_PROPERTIES CTL_CODE(FILE_DEVICE_SERIAL_PORT,29,METHOD_BUFFERE D,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_GET_DTRRTS CTL_CODE(FILE_DEVICE_SERIAL_PORT,30,METHOD_BUFFERE D,FILE_ANY_ACCESS)

bluna
20.12.2005, 10:26
hm, ich glaube die winioctl.h hat gefehlt.


ich hab mal den port gesnifft, also das terminalprogramm pollt nur den comport und wenn ich dtr anhacke, wird dieser aktiviert.

bluna
20.12.2005, 11:13
nochmal kurz ne frage. cts muss ich auf high ziehen oder?
ansonsten bei masse darf ja der pc senden, oder ist dies sosiso irrelevant?
-------------------
[edit]
jipii, ich glaube ich habs jetzt. es läuft beim tastendruck weiter, aber gleich 2 mal, jetzt ist es aber nichtmehr weit bis zum ziel. den code poste ich in ein paar minuten.

bluna
20.12.2005, 12:53
wenn mir jetzt noch jemand sagen kann wiso das programm 2mal durchläuft, obwohl ich nur einmal gedrückt habe, dann mache ich luftsprünge ;)

komischerweisse ist das aber nur bei den ersten 2 mal der fall, dass "er" das programm 2 mal ausführt, danach klappt es wie es sollte - aber leider auchnicht immer.
..
wenn ich wärend der sleeptime drücke, wird das programm nur einmal ausgeführt, dnach immer 2 mal :(






#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <winioctl.h>

using namespace std;


int main(void)
{
DWORD dwfreq=800, dwDuration=200;
DWORD dwEvtMask;
int anzahl=0;
BOOL succ;
///////////////////////////////////////////////////
DCB dcb;

memset(&dcb, sizeof(dcb), 0);

dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_600;
dcb.fBinary = TRUE;
dcb.fParity = TRUE; // enable parity checking
dcb.fOutxCtsFlow = FALSE; // CTS output flow control
dcb.fOutxDsrFlow = FALSE; // DSR output flow control
dcb.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type
dcb.fDsrSensitivity = FALSE; // DSR sensitivity
dcb.fTXContinueOnXoff = FALSE; // XOFF continues Tx
dcb.fOutX = FALSE; // XON/XOFF out flow control
dcb.fInX = FALSE; // XON/XOFF in flow control
dcb.fErrorChar = FALSE; // enable error replacement
dcb.fNull = 0; // enable null stripping
dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
dcb.fAbortOnError = FALSE; // abort on error
dcb.fDummy2 = 0; // reserved
dcb.wReserved = 0; // not currently used
dcb.XonLim = 0; // transmit XON threshold
dcb.XoffLim =0; // transmit XOFF threshold
dcb.ByteSize = 8; // number of bits/byte, 4-8
dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
dcb.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
dcb.XonChar = 0; // Tx and Rx XON character
dcb.XoffChar = 0; // Tx and Rx XOFF character
dcb.ErrorChar = 0; // error replacement character
dcb.EofChar = 0; // end of input character
dcb.EvtChar = 0; // received event character
dcb.wReserved1 =0; // reserved; do not use
///////////////////////////////////////////////////

HANDLE hCOM = CreateFile ("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

//////////////////////////////
start:
//////////////////////////////
//warteschelife - damit das signal nicht gleich 2 mal abgegriffen wird
printf("Bitte warten!...");
Sleep(2000);
printf("...Weiter.");
//warteschleife ende
//////////////////////////////


succ= SetCommState(hCOM, &dcb);


//////////////////////////////
cout << "" <<endl;
cout <<"------------------------"<<endl;
cout <<"Auf Signal warten."<<endl;


SetCommMask(hCOM,EV_DSR); //
WaitCommEvent(hCOM,&dwEvtMask,NULL); // auf tastendruck warten


printf("%d",dwEvtMask);
cout <<"<--->"<<endl;
printf("%d",EV_DSR);

if(dwEvtMask & EV_DSR)
{
printf("....jjojojoojojojojoj....");

//noch ein peep ausgeben
Beep (dwfreq,dwDuration);
//cout<<'\a';
//bepp ende

}

cout <<"Signal erhalten."<<endl;
cout <<"------------------------"<<endl;
cout << "" <<endl;
//////////////////////////////


//////////////////////////////
//datei oeffnen

//funktioniert
cout <<"Increment wird geoeffnet."<<endl;
cout <<"------------------------"<<endl;
system("d:\\Dev-Cpp\\Examples\\inc.bat");
cout <<"------------------------"<<endl;
cout <<"Increment beendet."<<endl;
//datei oeffnen ende
//////////////////////////////

//////////////////////////////
++anzahl;
cout << "" <<endl;
cout << "" <<endl;
printf("Es wurde ");
printf("%d",anzahl);
printf(" mal Incrementiert.");
cout << "" <<endl;
cout << "" <<endl;
//////////////////////////////

cout << "****************************" <<endl;
cout << "" <<endl;


goto start;
//////////////////////////////

CloseHandle(hCOM);
return 0;
}

bluna
20.12.2005, 14:14
kommt mir so vor als ob der bei jeder flanke und nicht bei jeder 1 an dsr aus dem wait rausspringt.

NumberFive
20.12.2005, 16:09
Das mit der Flake kann gut sein das es ja was mit dem Modem status zutun hat. da muß man immer reagieren wenn sich da was ändert. aber das solltest du doch program techisch abfangen können oder ?.

Sorry ging nicht früher

bluna
20.12.2005, 18:33
hi, naja, ich habs ja jetzt hinbekommen.
evtl nehme ich nen schalter oder mach noch nen monoflop rein, wobei eine programmiertechnische lösung die bessere wäre. ich habs gerade so noch hingemurxt glaube ich, naja mal auf die testphase warten :P

ich danke dir aufjedenfall vielmals für deine super hilfe!!!

NumberFive
20.12.2005, 18:44
schon wenn ich dir helfen konnte.
kannst doch einfach fragen bevor du wieder ins Wait gehst op das signal wech ist. Oder machst zwei wait hinter ein ander bei ersten ON bei zweiten OFF dann erst sleep. wenn jetzt bei ein schalten den schalter fest hält klaps.

Sag mal wie beendest du das Prg eingenlich ?

Es ist Klein und fein aber bei mir hätte das ding mindestens ein thread damit ich die sache sauber beenden kann.

Gruß

bluna
21.12.2005, 09:40
das muss nicht beendet werden.
es läuft meistens im 2schichtbetrieb und manchmal im 3schichtbetrieb, also denk ich mal reicht das so. ausserdem kann man das betriebssys ja runterfahren und dann gehts mit aus. der pc wird ja für NICHTS anderes verwendet ausser knopf und anzeige.

problem ist sowiso mein mangeldes c++ verständniss/kenntniss.

ich bin so ganz zufrieden weil es ja geht (mit 2 waits) und widme mich nun der dokumentation und der php-oberfläche.

NumberFive
23.12.2005, 09:21
Na den Fröhliche Weihnachten

bluna
23.12.2005, 14:14
danke, dir auch n frohes fest

Deathadders
23.12.2005, 21:21
also, bin neu hier, und stieß grad auf diese thema, wo ich sehr gut weiter helfen kann:
es gibt ne port.dll, die man einfach ein das systemverzeichniss des PCs kopiert, mit der man das gaanz einfach machen kann. Die Dll inklusive eines kleinen tutorials gibt es hier: http://www.the-starbearer.de/Praxis/ElektronikamPC/RS232/portdll.htm

der quelltext sieht dann ugefär so aus:




Public Class Form1
Declare Function DSR Lib "Port.dll" () As Integer 'einbindung eines neuen befehl

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
If DSR = 1 Then MsgBox("TXD is aktiv")
End Sub
End Class

TXD ist die bezeichnung für pin 4 das ist auch snst hier nach zu lesen: http://de.wikipedia.org/wiki/RS232

vielleicht hilf dir auch mein ComETst programm weiter, ich kann es dir mailen, falls nötig,

MfG deathadders

bluna
07.02.2006, 09:45
hallo, ich bin noch einmal.
ich hätte da noch eine frage, es geht lediglich um einen lösungsvorschlag.

also nicheinmal kurz ein überblick.
ich habe ein php programm auf einem apache webserver und eine oracle datenbank.
wenn nun am client der taster gedrückt wird, wird über ein c++ programm in die datenbank geschrieben.

das php programm, das auf dem client "läuft" bzw. dort aufgerufen/angezeigt wird, ruft die daten regelmässig aus der datenbank ab.

jetzt wäre wünschenswert, dass per tastendruck die php-seite aktualisiert wird.
ich weiss leider keinen lösungsweg, da ich in c++ nicht so firt bin und mit php geht das nicht. nach meinen suchergebnissen geht das auch mit javascript nicht.

wie könnte ich das dann lösen?
kann ich mit c++ meine aktuell angezeigte php seite (es ist IMMER nur eine seite aufgerufen auf dem client!) aktualisieren?

danke schonmal

NumberFive
08.02.2006, 03:48
du könntest dir eine App bauen wo du den Internet explorer rein baust.
wenn das ding in die DB geschrieben hat machst du noch mal den seite aufruf dann sollte die seite erneuert werden.

Aber warum baust du die seite nicht eifach per timer wieder auf geht hier im forum ja auch mit der wer ist anmeldet zb.

Ist doch einfacher als eine Anwendung zu bauen oder ?

ES gibt noch das package dbms_alert oder dbms_pipe damit kann man dem client aus der db benachrichtigen in wie weit das aber mit php geht keine ahnung.

bluna
08.02.2006, 08:40
was meinst du mit app bauen? eine c applikation die den ie öffnet/beinhaltet?

also ich wollte es mal mit javascript und irgendwie window.reload und target machen, mal schauen ob es soetwas in verbindung gibt, und ob das klappt.

also einen automatischen reload der seite gibt es ja, aber es soll auch mit tastendruck aktualisiert werden (leider :) ) (so hab ich das mit deinem timer verstanden)

NumberFive
09.02.2006, 20:13
Naja auf ein windows kist kann man recheinfach und schnell den Internet Explore als eingene Anwendung verkaufen. Dann kann man mit window.external.<funktion> per Html dan den Frame befehle schicken und damit was bauen so war mein gedanke. Vielleicht hilft die das was leider kenn ich mich in Internet programmierung nicht so gut aus.

UlrichC
09.02.2006, 21:06
Wo brennts?

Ich habe es so verstanden eine C-App die einen Taster abfrägt incrementiert einen Wert. Dieser Wert soll im auf einer Webseite angezeigt werden...
Die darfst PHP verwenden.
Du hast C Erfahrung
...stimmt das?
(Bin nur querleser ... daher als mein textunverstand ;-) )

ja dann ... schau mal im Google nach CGI-Counter ... die incrementieren Werte auf basis von Seitenaufrufen.
Diese *verfahren kannst Du für Deine Zwecke nutzen.
Mache über das C-Programm mit Hilfe des HTTP-Protokolls und Sockedprogrammierung einen Aufruf des Counters.
Der Wert kann dann nach dem zwischenspeichern durch das PHP-Skript auf einer anderen Seite (wieder mit PHP) angezeigt werden.

*verfahren:will ich jetzt noch nicht näher erleutern... download einfach mal das einfachste PHP CGI-Skript zu diesem Thema (Counter) ... aber achte darauf das es ohne Datenbankanbindung (mySQL etc.) läuft und kein Grafikcounter ist ... (sonst mußt Du viel code räumen)!!!
Ich mache selbst kein PHP im Web ... und könnte Dir daher nur Perlsoucen schicken.

Wobei es mit Perl meist auch geht.
PS Perl ist wie C ... nur noch etwas etwas staubiger und kryptisch aber schnell *iLoveIt*

Netter Gruß,
Chris

bluna
11.02.2006, 14:15
danke für den ansatz. ich werde mich dann mal informieren.

rich
09.06.2006, 12:35
tschuldige, wenn ich mich mal kurz dazwischen schalte, aber hat den COM zugriff schon mal wer mit visual studio 2005 und .NET gemacht? wenn ja, könnt wer vielleicht ein code sample online stellen?

UlrichC
09.06.2006, 16:04
Ja nu,
in .NET ohne große Erfahrung kann man als erstes versuchen die "MSComm" anzuhacken. Das ist ein Steurelement auf ActiveX-Basis.
Wenn das nicht hilft und in die bekannten Abgründe der MSN führt, würde ich einen C-Code verwenden.
Der Compiler ist da nicht so wählerisch ;-)

Google am besten mal nach "MSComm .NET".

Gruß,
Chris

rich
09.06.2006, 20:46
hey dankeschön! hört sich recht gut an, nur is gleich mal bei den gegoogelten ergebnissen, dass es für VB is, gibts auch eine variante für C++?

UlrichC
09.06.2006, 21:36
Du hast was von .NET geschrieben, da denk ich spontan an VB.NET oder C#.

Nun C++ ohne .NET also nur VStudio6/2005/2006?

Also dann ... bleibt nur noch C oder eine C++ Klasse mit C inside.

Schau mal bei http://www.c-plusplus.de/ vorbei.
Die haben haben da mal was vor einer Weile zusammengespengelt.

Wenn du es nicht findes kann ichs dir auch schicken (cport.h und cport.c(pp) ).