004
27.07.2004, 23:44 Uhr
~wasa
Gast
|
Tagchen!
also, das ist gar nicht so einfach. Mein Program ist dialogfeld basierend. Habe dort nen Button, der, wenn gedrückt wurde, einen Thread laufen lässt, der ein Verzeichnis nach ner bestimmten Datei durchsucht. sobald die datei gefunden wurde, liest er davon die daten aus. Danach öffnet er den ComPort und liest mittels ReadFile den AusgabeString des Messgerätes ein. Ich bekomme nen 14 Byte langen String. Den ich dann (leider) dekodieren muss, da binär codiert, wenn dies erfolgt ist gebe ich die Daten in nem Listenfeld aus. Das läuft alles in dem einen Thread! Wenn ich die daten ausgegeben habe, soll das Steuerprogramm die nächste Messung vornehmen!
Zitat von Verfasser: |
habe einen Puffer von 1000 angelegt.
Warum so viel? Einfach nur so, oder hat das einen Zweck?
|
Mir wurde gesagt, dass man das machen soll, da das Messgerät doch ständig Daten sendet.
NICHT ERSCHRECKEN, ICH STELL HIER MAL DEN QUELLCODE REIN!!! ComPort.h
C++: |
#include <windows.h>
class CCOM_PORT1{ public: CCOM_PORT1(); ~CCOM_PORT1();
int modul, rc;
HANDLE Open_Comport_HS();
int Write_Comport_HS (HANDLE DriverHandle, DWORD NumBytes, void *Buffer); int Read_Comport_HS (HANDLE DriverHandle, DWORD NumBytes, void *Buffer); };
|
Die Funktionen zum Öffnen / Lesen / Schreiben des COMs
C++: |
#include "stdafx.h" #include "COM_PORT1.h"
CCOM_PORT1::CCOM_PORT1(){ }
CCOM_PORT1::~CCOM_PORT1(){ }
HANDLE CCOM_PORT1::Open_Comport_HS(){ HANDLE DriverHandle; DCB Our_DCB;
DriverHandle = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);//OPEN_EXISTING if(DriverHandle!=0){ GetCommState(DriverHandle, &Our_DCB);
Our_DCB.BaudRate = 2400; //2400 Our_DCB.ByteSize = 8; Our_DCB.Parity = NOPARITY; Our_DCB.StopBits = ONESTOPBIT;
Our_DCB.fDtrControl = DTR_CONTROL_ENABLE; //Our_DCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
SetCommState(DriverHandle,&Our_DCB);
return DriverHandle; }else return 0; }
int CCOM_PORT1::Write_Comport_HS (HANDLE DriverHandle, DWORD NumBytes, void *Buffer){ DWORD BytesWritten; BOOL status; status = WriteFile (DriverHandle, Buffer, NumBytes, &BytesWritten, 0); return TRUE; }
int CCOM_PORT1::Read_Comport_HS (HANDLE DriverHandle, DWORD NumBytes, void *Buffer){ DWORD BytesRead; BOOL status; char *ptr;
ptr=(char*)Buffer; status = ReadFile (DriverHandle, Buffer, NumBytes, &BytesRead, 0); ptr+=BytesRead; *(ptr)=0x00; return TRUE; }
|
und nun der Hammer, ist Auszug aus der ..dlg.cpp müsstest du ja kennen ;-) hoffe ich kreig kein ärger, wenn ich so viel hier reinstelle
C++: |
void CVersion1507Dlg::Verz_RunThread() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen WIN32_FIND_DATA V_Data; //DatenVerzeichnis CString s_file,s_temp,s_Schreibe, s_Eintrag="", minus="", ein1="", ein2="", ac="", dc="", auto1="", rs232c="", prafix0="", prafix="", prafix2="", prafix3="", komma=","; char c_Daten[13]; FILE* f_File; int zahl1, zahl2, zahl3, zahl4; // Verzeichnisabfrage while (verz_i_Flag) { HANDLE hSearch = FindFirstFile("C:\\Messungen\\*.what",&V_Data); // Wenn File gefunden.... if((int) hSearch!=-1) { Onleeren(); ListenEintrag("-----Datei gefunden-----"); s_temp = V_Data.cFileName; s_file = "C:\\Messungen\\"; s_file = s_file+s_temp; s_Eintrag.Format("Datei:%s",s_file); ListenEintrag(s_Eintrag); f_File = fopen(s_file,"rt"); s_temp = fgets(c_Daten,13,f_File); s_Eintrag.Format("Daten: %s",s_temp); ListenEintrag(s_Eintrag);
s_Eintrag.Format("Wiederholungen: %c", c_Daten[0]); ListenEintrag(s_Eintrag); s_Eintrag.Format("Intervall: %c", c_Daten[1]); ListenEintrag(s_Eintrag); // Com öffnen com_ComHandle1=com_port_1.Open_Comport_HS(); Sleep(500); ListenEintrag("COM geöffnet!!"); for (int n=1; n<=3; n++) { com_port_1.Read_Comport_HS(com_ComHandle1, 14, L); //L ist halt der Buffer L[1000];
// Byte 0 auslesen und interpretieren int y=(L[0]&0x01); int y1=(L[0]&0x02); int y2=(L[0]&0x04); int y3=(L[0]&0x08); if(y == 0) {rs232c = "no";} else {rs232c = "yes";} if(y1 == 0) {auto1 = "no";} else {auto1 = "yes";} if(y2 == 0) {dc = "";} else {dc = "Gleichgröße";} if(y3 == 0) {ac = "";} else {ac = "Wechselgröße";} //s_Eintrag.Format("rs232: %s auto: %s dc: %s ac: %s", rs232c, auto1, dc, ac); //ListenEintrag(s_Eintrag);
// Byte 1 und 2 auslesen und interpretieren sowie in "Zahlen" umwandeln int x=(L[1]&0x07)*16+(L[2]&0x0F); switch (x) { case 125: zahl1 = 0; break; case 5: zahl1 = 1; break; case 91: zahl1 = 2; break; case 31: zahl1 = 3; break; case 39: zahl1 = 4; break; case 62: zahl1 = 5; break; case 126: zahl1 = 6; break; case 21: zahl1 = 7; break; case 127: zahl1 = 8; break; case 63: zahl1 = 9; break; } // das mache ich nunn noch mal für byte 3-8 habe ich aber aus // Platzgründen weggelassen // Byte 9 auslesen und interpretieren int neun=(L[9]&0x01); int neun1=(L[9]&0x02); int neun2=(L[9]&0x04); int neun3=(L[9]&0x08); if(neun != 0) { prafix0 = "diode"; } else { if(neun1 != 0) { prafix0 = "k"; } else { if(neun2 != 0) { prafix0 = "n"; } else { if(neun3 != 0) { prafix0 = "u"; } else { prafix0 = ""; } } } } // Mache ich noch für Byte 10-13 um Präfixe etc zu ermitteln // Wegen Platzgründen weggelassen
// Das stimmt nun halt so nicht, wegen der undefinierten konstanten s_Eintrag.Format("Gesamter Messwert mit Einheit: %s%i%i%i%i%s%s%s%s", minus, zahl1, zahl2, zahl3, zahl4, prafix0, prafix, prafix2, prafix3); ListenEintrag(s_Eintrag); // Intervallangabe pause Sleep(5000); }
//Wegen löschen Testzwecke Sleep(30000); /* fclose(f_File); DeleteFile(s_file); TRACE("\n\n*************Datei %s wurde gelöscht*************\n\n",s_file); s_Eintrag.Format("Datei %s wurde gelöscht",s_file); ListenEintrag(s_Eintrag); Sleep(2000); */ } else { ListenEintrag("-----keine Datei gefunden-----"); Sleep(1000);
} } }
|
habe soviel wie möglich weggelassen! SORRY! ist ziemlich viel! aber ich komme echt nicht weiter! VIELEN VIELEN DANK SCHONMAL!!! cu wasa |