Til Bertel

Tags:    c++ database locking timestamping samtidighed transaktion

Hej bertel
Jeg er kommet vidre med dette project: http://www.udvikleren.dk/thread.php?techid=1&f=1&t=660
Det var min computer der var noget galt med den gad ikke køre programmene du lavede til mig men da jeg formaterede og prøvede fik jeg lystet til at lyse og slukke hver gang jeg trykkede på enter! Men nu er spørgsmålet kan du hjælpe mig med at lære at forstå at lave programmer til serial porten så jeg selv kan lære det??? Kan du f.eks hjælpe mig med at forstå følgende program som vi lavede sidst:

#include <stdio.h>
#include <windows.h>

void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}

void Tx(HANDLE Port, const char *data)
{
DWORD Dummy;
WriteFile(Port, data, strlen(data), &Dummy, 0);
WriteFile(Port, "\\r\\n", 2, &Dummy, 0);
}

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length, i;

ReadFile(Port, Buffer, 128, &Length, 0);

for(i = 0; i < Length; i++)
if(Buffer != '\\r')
printf("%c", Buffer);
}

int main(void)
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);

int Counter = 0;
while(1)
{
if(Counter & 1)
dcb.fRtsControl = RTS_CONTROL_ENABLE;
else
dcb.fRtsControl = RTS_CONTROL_DISABLE;
printf("Counter: %d\\n", Counter);
SetCommState(ComPort, &dcb);
Counter++;
getchar();
}

CloseHandle(ComPort);

return 0;
}






49 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Man kan ikke få TX til at gøre det samme som de to.
Når man sender en byte/char på Tx sender den de 8 bit (+ et startbit og et stop bit) og vender så tilbage til udgangspunktet. Så du vil kun se en (meget) kort puls.
På byggesættet har de noget elektronik der husker på hvad der blev sendt.

Rx virker kun ordentligt hvis der modtages en korrekt formateret byte. Med vindmåleren checker man for alle mulige fejl situationer og siger at når der er en fejl på linien er der nok skabt en kontakt på Rx porten.



Hej bertel nu har jeg plaget dig længe men bare et sidste ønske eftersom jeg snart har lavet selveste vindmåleren kan du så ikke forklare dette program med kommentare:

#include <stdio.h>
#include <windows.h>

void SetTimeOut(HANDLE Port, int MSec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = MSec;
commtimeouts.ReadTotalTimeoutMultiplier = 1;
commtimeouts.ReadTotalTimeoutConstant = MSec;
SetCommTimeouts(Port, &commtimeouts);
}

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;

ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
if(Length || ErrorType)
printf("."); } int main(void)
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fErrorChar = TRUE;
dcb.fParity = TRUE;
dcb.Parity = ODDPARITY;
dcb.fAbortOnError = TRUE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);

while(1)
Rx(ComPort);

CloseHandle(ComPort);

return 0;
}

Bare fra linien void Rx(HANDLE Port) og ned til bunden bare sådan jeg kan forstå det nogenlunde efter som det er pisse svært at forstå det på msdn???




F.eks forstår jeg det er i denne if sætning jeg skal sætte noget mere kode ind hvis jeg vil lave sådan den tæller hvor lang tid hjulet tager om at dreje rund:

ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
if(Length || ErrorType)
printf("."); } int main(void)
{

Men der er ingen start og slut tuborgklammer i if sætningen så kan ikke rigtigt forstå hvordan jeg skal sætte mere kode ind??? og så forstår jeg heller ikke at den går videre i programmet og først der laver den forbindelsen til com porten!



Det er faktisk kun det her:

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;

ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
if(Length || ErrorType)
printf("."); } int main(void)
{

og det her:

while(1)
Rx(ComPort);


Jeg ikke helt forstår!



Følgende bruges til at få den til at kalde Rx forevigt:
while(1)
Rx(ComPort);

I Rx bruges ReadFile til at vente på at der er modtaget en byte, eller (mere sansynligt i denne forbindelse) at der er opstået en fejl situation på porten.
Hvis der er opstået en fejl vil ClearCommError slette et internt fejl-flag, og sætte ErrorType til at fortælle hvilken fejl.
Hvis der er modtaget en karakter eller der er opstået en fejl vil den udskrive en . ellers (i tilfælde af timeout) vil den bare returnere.

Med følgende kode vil den tage tid på hvor lang tid der går mellem to events:
http://home20.inet.tele.dk/midgaard/vind2.cpp



Ok men jeg forstår stadig ikke selveste fejlmeddelsen det må jo være her den tjekker efter fejl eller hvad:

if(Length || ErrorType)

Men jeg forstår ikke helt hvordan den kan vide om der er en fejl!



Nåh ups nu forstod jeg det men jeg forstod ikke hvad linien
if(Length || ErrorType)
skal bruges til!



Hmm tror jeg har fundet ud af det hele nu! Nu mangler jeg kun lige time funktionen jeg søgede på msdn men for et eksempel som jeg ikke fatter kan du forklare kort hvordan time funktionen virker eller kender du en guide???



time funktionen kan kun måle i hele sekunder, og det er ikke nok til dette formål.

Jeg bruger QueryPerformanceCounter:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/queryperformancecounter.asp



Tak for alt det hjælp du har givet mig Bertel Brander du er bare sej til det der c++!

Jeg fandt selv en simplere tids funktions guide! Nu vil jeg til at lave programmet og i morgen min vindmåler færdig og så skal det prøves af :-)


Hvordan lærer man alt det der com port programmering? hvor har du lært det? Kan man evt. finde et gammelt modem og så bare sidde og lære det hele der ved bare ved at finde kode eksempler og så prøve det af på modemet eller hva???

endnu en gang tusind tak!

vil du ikke have pointene kan du så ikke lige besvare så du kan få dem???




t