000
27.07.2003, 12:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft... (Operator)
|
Hi, ich habe mir ne klasse geschrieben mit der ich mir die werte von einem Messschieber und ner messuhr über die serielle schnittstelle einlesen kann.
header file
C++: |
#ifndef MESSGERAETE_H #define MESSGERAETE_H
#include "windows.h"
class Messgeraete{
public:
Messgeraete(); ~Messgeraete();
void takeValues(); double getValue(int value); void stopThread(); //-1: Messung wurde abgerochen, 0 keine gütligen Werte, 1 gültige Werte wurden gelesen int getMessflag(); static DWORD messenThread(LPVOID);
private:
HANDLE h_com; HANDLE h_messThread; double value1, value2; int messflag;
}; #endif
|
cpp-file
C++: |
#include "stdafx.h" #include "Messgeraete.h" #include "stdio.h"
Messgeraete::Messgeraete(){ messflag=0;
h_com = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);
DCB dcb; COMMTIMEOUTS cto;
GetCommState(h_com, &dcb);
dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(h_com, &dcb);
GetCommTimeouts(h_com,&cto);
cto.ReadTotalTimeoutConstant=0; cto.ReadTotalTimeoutMultiplier=0;
SetCommTimeouts(h_com,&cto);
}
Messgeraete::~Messgeraete(){
CloseHandle(h_com);
}
DWORD Messgeraete::messenThread(LPVOID lparam){
DWORD dw; int i; unsigned long nBytesRead1,nBytesRead2; char inbuffer1[13]; char inbuffer2[13]; char temp[9]; temp[8]=0;
ReadFile(((Messgeraete*)lparam)->h_com, &inbuffer1, 13, &nBytesRead1, NULL); ReadFile(((Messgeraete*)lparam)->h_com, &inbuffer2, 13, &nBytesRead2, NULL);
for(i=0;i<8;i++) temp[i]=inbuffer1[i+4]; ((Messgeraete*)lparam)->value1=atof(temp);
for(i=0;i<8;i++) temp[i]=inbuffer2[i+4]; ((Messgeraete*)lparam)->value2=atof(temp);
((Messgeraete*)lparam)->messflag=1;
GetExitCodeThread(((Messgeraete*)lparam)->h_messThread, &dw);
ExitThread(dw);
return 0;
}
void Messgeraete::takeValues(){
messflag=0; h_messThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)messenThread, (LPVOID)this, 0, NULL); }
double Messgeraete::getValue(int value){
if (value==1) return value1; else return value2;
}
void Messgeraete::stopThread(){ DWORD dw; GetExitCodeThread(h_messThread, &dw); TerminateThread(h_messThread, dw); value1=value2=-1; messflag=-1; }
int Messgeraete::getMessflag(){ return messflag; }
|
mein problem liegt hier
C++: |
TerminateThread(h_messThread, dw);
|
manchmal (ca. jedes 100. mal wird der thread nicht richtig beendet. checken kann ich das irgendwie auch nicht, weil terminatethread mir immer true zurückliefert, hab ich ausprobiert. Habt ihr ne Idee wie ich den Readfile anders abbrechen kann. Es darf auf keine Fall mit timeout sein, weil es sonst passieren kann das der user auf werte übertragen klickt während die schnittstelle nicht empfangsbereit ist.
ich hoffe ich habe das verständlich genug erklärt wenn nicht fragen
Über brauchbare Anregungen würde ich mich freuen
Danke Heiko
Ach so, gut wäre es wenn man einen dummy-datensatz an die com1 schicken könnte. Allerdings blockiert mir der readfile die komplette schnittstelle so lange bis der von aussen beendet ist. Gibts da vielleicht ne möglichkeit den empfangspuffer einen datenempfang "zu verkaufen" der nicht von aussen kommt. -- ...fleißig wie zwei Weißbrote Dieser Post wurde am 27.07.2003 um 12:48 Uhr von Heiko editiert. |