003
08.10.2004, 11:01 Uhr
Mr. T
|
Zitat von Bruder Leif: |
@Fensterlos: Du kannst Dein Programm beim Aufruf von ShowWindow(...) mit dem Parameter SW_HIDE verstecken. MFC oder API?
|
Uff!
Danke Ihr 2!! Also mache ich mir um den Speicher keine Sorgen mehr...
Mit dem Fenster weiß ich ehrlichgesagt nicht. Ich in eine win Konsolenanwendung hineinprogrammiert, weil ich nur davon während dem Studium was beigebracht bekommen habe. Gibts da vielleicht was anderes? Was genau ist mfc bzw api?
Dann hätte ich jetzt eine neue Frage, zunächst der Code:
C++: |
#define MAKEWOR(A,B) ( ((A)<<8) + (B)))
#include "stdafx.h"
HANDLE h_com1_Bus = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL); //HANDLE h_com2_Bus = CreateFile("COM2", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0 , NULL);
void Com1Ini() { ////////////////////////////////COM1////////////////////////////////////
DCB com1_Einstellungen; COMMTIMEOUTS com1_HorchZeit; com1_Einstellungen.BaudRate = 115200; com1_Einstellungen.ByteSize = 8; com1_Einstellungen.Parity = MARKPARITY; com1_Einstellungen.StopBits = ONESTOPBIT; SetCommState(h_com1_Bus, &com1_Einstellungen); GetCommState(h_com1_Bus, &com1_Einstellungen);
com1_HorchZeit.ReadTotalTimeoutConstant=0; com1_HorchZeit.ReadTotalTimeoutMultiplier=0;
SetCommTimeouts(h_com1_Bus,&com1_HorchZeit); GetCommTimeouts(h_com1_Bus,&com1_HorchZeit); }
//////////////////////COM2////////////////////////////////////////////
void Com2Ini() { DCB com2_Einstellungen; COMMTIMEOUTS com2_HorchZeit;
com2_Einstellungen.BaudRate = 9600; com2_Einstellungen.Parity = NOPARITY; com2_Einstellungen.StopBits = ONESTOPBIT; com2_Einstellungen.ByteSize = 4;
SetCommState(h_com2_Bus, &com2_Einstellungen); GetCommState(h_com2_Bus, &com2_Einstellungen);
com2_HorchZeit.WriteTotalTimeoutConstant = 0; com2_HorchZeit.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(h_com2_Bus, &com2_HorchZeit); GetCommTimeouts(h_com2_Bus, &com2_HorchZeit); }
void StartPunkt() { unsigned long com1_ZuSchreibendeBytes, com1_GeschrBytes, com1_GelesBytes;//, com2_GelesBytes;
char com1_ZuSchreiben[1], com1_Gelesen[7];//, com2_Gelesen[1];
com1_ZuSchreiben[0] = 0x01; com1_ZuSchreibendeBytes = 1; for(;;) { //Mit Signal von SPS starten ReadFile(h_com2_Bus, &com2_Gelesen, 1, &com2_GelesBytes, NULL); if(com2_Gelesen[0]==0x01) {break;} }
for(;;) { //Token an Adresse 0x01 schicken (Laser) WriteFile(h_com1_Bus, &com1_ZuSchreiben, com1_ZuSchreibendeBytes, &com1_GeschrBytes, NULL); ///Startindex finden. Beim Nulldurchgang des Gebers sind die//// ////[3] & [4] beide 0x00. Kann nicht exakt getroffen werden,//// ////////also dieses kleine Fenster von 0x0000 - 0x000A////////// ReadFile(h_com1_Bus, &com1_Gelesen, 8, &com1_GelesBytes, NULL); if(com1_Gelesen[3]==0x00 && com1_Gelesen[4]<=0x0A) {break;}//Fenster getroffen!-->Starten! }
}
bool MesswertAufnahme() { char Messwerte[4000], Winkelwerte[4000], com1_ZuSchreiben[1], com1_Gelesen[7];
unsigned long com1_ZuSchreibendeBytes, com1_GeschrBytes, com1_GelesBytes;
int t = 0;
com1_ZuSchreiben[0] = 0x01;
com1_ZuSchreibendeBytes = 1;
for(t=0;t<4000;t++) { Messwerte[t] = 0x01; Winkelwerte[t] = 0x01; }
for(t=0;t<2000;t++) //Start der Messwertaufnahme { //Token an Adresse 0x01 schicken (Laser) WriteFile(h_com1_Bus, &com1_ZuSchreiben, com1_ZuSchreibendeBytes, &com1_GeschrBytes, NULL);
/////Teilnehmer 0x01 sendet jetzt Daten, einlesen von 7Bytes:///// //////[0]=Wert,[1]=Wert,[2]=Token der an Teilnehmer als Folge///// ///Teilnehmer eingestellt ist. Hier 0x02, der Inkrementalgeber./// ///////[3]=WertA, [4]=WertB, [5]=Token. Ende des Comkreises/////// ReadFile(h_com1_Bus, &com1_Gelesen, 8, &com1_GelesBytes, NULL);
/////Wenn das dritte Byte nicht das Token 0x02 ist, Fehler!///// /////Wenn das fünfte Byte nicht das Token 0x03 ist, Fehler!///// if(com1_Gelesen[2]!=0x02 || com1_Gelesen[5]!=0x03) { cout<<"\nCom Fehler\n" <<"Gelesen wurde : " <<com1_Gelesen[0] <<com1_Gelesen[1] <<com1_Gelesen[2] <<com1_Gelesen[3] <<com1_Gelesen[4] <<com1_Gelesen[5] <<com1_Gelesen[6] <<com1_Gelesen[7] <<"-->Fehler" <<endl; return (false); }
//////////////////Speichern der 0x Werte////////////////////////// else { Messwerte[2*t] = com1_Gelesen[0]; Messwerte[2*t+1] = com1_Gelesen[1]; Winkelwerte[2*t] = com1_Gelesen[3]; Winkelwerte[2*t+1] = com1_Gelesen[4]; }
}
CloseHandle(h_com1_Bus); CloseHandle(h_com2_Bus); } double i, j;
for(t=0;t<2000;t++) { ////////////Wenn Ausserhalb des Messbereichs, Fehler!!////////// if(Messwerte[t]>=0xFF && Messwerte[t+1]>=0xFE) { cout<<"\nMessbereich verlassen, Fehler\n" <<"Gelesen wurde : " <<Messwerte[t] <<Messwerte[t+1] <<Winkelwerte[t] <<Winkelwerte[t+1]; return (false); }
/////Wenn kein Fehler vorliegt, werden Messwerte geschrieben///// else { //Radius gür AlleWerte[] Feld i = MAKEWORD(Messwerte[2*t+1], Messwerte[2*t]); i = (i - 2768) * 70 / 60000 + 28; cout<<t<<"\t" <<"DEZ: "<<i <<(i-2768)*70/60000+28 <<"\t"; j = MAKEWORD(Winkelwerte[2*t+1], Winkelwerte[2*t]); } } return (true); }
void main() { Com1Ini(); //Definieren der Schnitstelle
Com2Ini(); //Definieren der Schnitstelle StartPunkt(); //Start der Messung erwarten
MesswertAufnahme(); //Messen Starten und speichern
}
|
Also: was könnte mein Problem sein, dass manchmal die Kommunikation zwischen mir und meinen Teilnehmern nicht funzt? Nur selten passiert es, dass ich eine 0x01 sende (writefile mit Erfolg) und dann bleibt mein programm im readfile() stecken, und bekommt also keine Antwort. An den Teilnehmern liegt es bestimmt nicht, das kann ich ausschliessen! Dann probiere ich alles mögliche aus mit ändern der zu lesenden bytes, runterfahren, hochfahren, andere Versionsstände dieses Programmes und irgendwann funzt es dann wieder... Die couts sind gerade nur zum kontrollieren mit drinnen... Danke!! -- So ist das! Dieser Post wurde am 08.10.2004 um 11:05 Uhr von Mr. T editiert. |