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
Når du skal læse kan du specificere to tider.

Max tiden mellem ankomst af to bytes. Dette er ReadIntervalTimeout

Derudeover kan du specificere hvor lang tid du vil vente ialt. Denne tid er delt i to, en fast tid (ReadTotalTimeoutConstant) og en tid der ganges med antallet af bytes du vil læse (ReadTotalTimeoutMultiplier).

Du kan ved at sætte disse tal rigtigt få den til at vente for evigt dvs til alle de bytes du beder om er læst, eller slet ikke vente, dvs kun læse de bytes der står i bufferen og venter.

For skrivning er der kun en samlet tid, en fast tid (WriteTotalTimeoutMultiplier) og et tal der ganges med antallet af bytes du vil sende (WriteTotalTimeoutConstant),

For både modtage og sende gælder der at hvis tiderne overskives vil læsning og skrivning blive afbrudt.



Hmm for det første så ved jeg jo kun hvordan man programmer til com porte og denne er jo ikke til com: http://www.brinck.dk/byggesaet/br848.asp
Tror du ikke selv man kan lave noget ligende det man kan købe der bare til com eller kan man købe den til com porten istedet???



Til Com-porten er der http://www.brinck.dk/byggesaet/br847.asp
Den er noget mere avanceret, koster 389,-

Man kan godt strikke noget sammen selv, men det er ikke ret let, og næppe meget billigere, specielt hvis man vil kunne læse/skrive flere porte.



Er det så bare den samme programmering som jeg er ved at lære eller hvad???



Er det så bare den samme programmering som jeg er ved at lære eller hvad???


Hvis du vælger byggesættet til COM-porten er den samme måde at snakke med kortet på.
Du kan læse med RX funktionen og skrive med TX funktionen.
Jeg har dog ikke prøvet sættet.



Hmm har fulgt lidt med i denne tråd da det lyder meget spærndende og jeg selv er ved at lave noget i samme stil. Det byggesæt du snakker om (BR 847) hvordan fungerer det?
Sættes det bare i com porten og så har du 8 udgange hvor der kan sendes strøm ud af?

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Jeg har ikke prøvet kortet så jeg ved ikke andet end det jeg kan læse på siden.
Så vidt jeg kan læse har kortet 32 digitale udgange, en digital udgang er enter on eller off, on er 5v off er 0.
8 af disse udgange kan kobles sammen til en analog udgang med 255 steps, dvs du kan sætte udgangen til at være 0, 5/255, 2*5/255, 3*5/255 etc.

Kortet har derudover 24 digitale indgange, dvs de kan teste om porten er on (tættere på 5 end på 0) eller off.

Man skal udover com-porten tilslutte en spænding på mellem 9 og 17 volt, her kan en gammel lader til mobil/legetøj/etc. bruges (hvis den laver DC, ellers skal der en ensretter på.)

Jeg vil tro at man programmerer det ved at sende 4bytes på com-porten og checker de 24 indgange ved at læse tre bytes.



Hmm hvad er alt det der bytes det forstår jeg ikke helt hvordan bliver det koblet ind i programmeringen til com porten nu syntes jeg lige at jeg begyndte at forstå det men da jeg hørte om det med bytes???



Rx funktionen fra min oprindelige kode modtager bytes/chars, Tx sender bytes/chars.

En byte er normalt på 8 bit. Så for at læse 24 porte må man læse 3 bytes (hvis det er bygget op som jeg forventer).

I den seneste kode bruger vi en af de pinde på porten der normalt bruges til flow-kontrol, men hvis man vil kontrolere mange porte må man bruge data porten, dvs Rx og Tx.



Hmm er det ikke også bedre at kunne bruge Tx funktionen istedet for:

dcb.fRtsControl = RTS_CONTROL_DISABLE;
og
dcb.fRtsControl = RTS_CONTROL_ENABLE;

Kan jeg ikke få Tx til at gøre det samme som de to og er det ikke bedre??? Jeg har kigget lidt på spørgsmålet med vindmåleren på www.kandu.dk og den er da god jeg har selv skaffet alle delene jeg er ved at samle dem! Men jeg vil også godt kunne programmere til så der skal jeg vil bruge Rx og hvordan virker det så kan du give nogle eksempler på Tx og Rx så jeg kan lære det hvis det er bedre end:
dcb.fRtsControl = RTS_CONTROL_DISABLE;
og
dcb.fRtsControl = RTS_CONTROL_ENABLE;



t