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
Hej Bertel Brander
Jeg prøvede selv at skifte lidt ud men hvad tror du der er galt med følgende program for det virker ikke helt som det skal:


#include <iostream>
#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 intet = 1;
int blink;

printf("Indstil hastigheden mellem hver blink! blinkende instilles i sek");
scanf("%d",blink);
blink = blink * 1000;

while(intet < 5)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
Sleep(1000);
dcb.fRtsControl = RTS_CONTROL_DISABLE;
SetCommState(ComPort, &dcb);
Sleep(blink);

}

CloseHandle(ComPort);

return 0;
}






Det skal være (bemærk &):
scanf("%d", &blink);

Der findes en del bedre måder at læse et tal fra brugeren.

Du mangler vist også at tælle intet op i loopen, ellers vil den fortsætte "forevigt".

Du bruger ikke Rx og Tx så du kan slette dem, Det er vist heller ikke nødvendigt at bruge SetTimeout.



Hej bertel ja jeg ved godt at scanf("%d", &blink); ikke er den bedste måde og jeg kender heller ikke så meget til den jeg ville have brug cin >> blink; men jeg kunne værken bruge cin eller cout hvordan kommer jeg til at kunne det??? og det med at loopen fortsætter forevigt er med vilie! Jeg har fjernet SetTimeout men kan ikke finde noget med Rx og Tx i koden hvor er det henne???



Hvis du vil bruge cin og cout skal du:

1: Inkludere <iostream>
2: Enten:
a: Skrive std::cout << "Whatever"; std::cin >> intet;
b: Skrive using namespace std; i toppen af filen, efter include'erne.

At bruge cin >> intet; er ikke ret meget bedre end scanf.

Det er de ubrugte Rx(...) og Tx(...) funktioner i toppen som du kan fjerne.

Hvis man lave en uendelig loop kan man skrive:
while(1)
{
....
}



Ok jeg har rettet koden så den ser sådan ud nu:

#include <iostream.h>
#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);
}



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);



float blink;


cout << "Indstil hastigheden mellem hver blink! blinkende instilles i sek" << endl;
cin >> blink;
blink = blink * 1000;

while(1)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
cout << "Her taendes lyset" << endl;
SetCommState(ComPort, &dcb);
Sleep(1000);
dcb.fRtsControl = RTS_CONTROL_DISABLE;
cout << "Her slukkes lyset" << endl;
SetCommState(ComPort, &dcb);
Sleep(blink);

}

CloseHandle(ComPort);

return 0;
}



Men der er stadig et lille problem når det er du går ind i programmet og programmet venter på man intaster noget i cin så står lyset bare og lyser hvordan gør jeg sådan det ikke begynder at lyse før loopet går i gang???



Hmm jeg fiksede den selv selvom jeg stadig ikke rigtig forstår hvorfor den begyndte at lyse i starten her er den nye kode:

#include <iostream.h>
#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);
}



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);



float blink;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
SetCommState(ComPort, &dcb);

cout << "Indstil hastigheden mellem hver blink! blinkende instilles i milisekunder" << endl;
cin >> blink;
blink = blink * 10;

while(1)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
cout << "Her taendes lyset" << endl;
SetCommState(ComPort, &dcb);
Sleep(blink);
dcb.fRtsControl = RTS_CONTROL_DISABLE;
cout << "Her slukkes lyset" << endl;
SetCommState(ComPort, &dcb);
Sleep(blink);

}

CloseHandle(ComPort);

return 0;
}


Nu har jeg bare nogle sidste spørgsmål hvordan virker alt det øverste oven over det jeg selv har lavet??? Hvordan virker oprettelsen af kontakt til serial porten kan du evt. sætte nogle kommentare ind i koden sådan jeg kan lære det helt! Du behøver ikke gøre det men hvis du har tid og lyst ville det være godt! Ellers kender du nogle guider eller nogle flere eksempler på hjemmesider med kommentare i??? Så jeg kan lære noget mere om det???

Håber virkelig du gider hjælpe for det er så sjovt at jeg er blevet helt bidt af at lære det så jeg kan lave mine egne programmer til mit lys og senere måske noget andet!



Jeg kan godt prøve at forklare, men det smarteste er nok at du prøver at læse om de forskellige funktioner på msdn først.

Hvis du f.ex. på google skriver CreateFile msdn er det første link:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp

Det er ikke helt let at forstå så spørg endelig hvis der er noget du ikke forstår.

Du kan finde en del information om programmering af porte her:
http://www.beyondlogic.org/



Hej Bertel Brander
Ok jeg er begyndt at kigge lidt på det! Men ved du hvordan jeg kan koble flere dioder til og så slukke og tænde for dem en af gangen??? Og hvordan jeg sætter en motor til istedet for dioden og så kan få den til at køre frem og tilbage???



Ok nu tror jeg at jeg har nogenlunde fat i det med CreateFile! Og er gået videre til commtimeouts:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/commtimeouts_str.asp

Men jeg forstår ikke helt det med commtimeouts hvad er det for nogle tider det skal inholde og sådan??? Kan du hjælpe mig med at forstå det Bertel???



Jeg vil foreslå at du tager et kik på www.brinck.dk og køber et byggesæt. De har f.ex et der hedder "Br 848 8 Kanals Parallelport Styring til PC" til 148,- Der medfølger software.



t