13. oktober 2005 - 14:35Der er
6 kommentarer og 1 løsning
Com port: virker ikke 1. gang, men derefter ingen problem
Jeg har et problem med et program der skal udføre nogle tests på en Mikroprocessor.
Programmet virker egentlig fint nok, bare ikke første gang det bliver kørt. Når den kører de tests, starter den med at bede om en acknowledge(?) fra MP'eren men den modtager ikke noget ack. Trykker du så på test igen, vil programmet fint afvikle testen uden problemer.
else { switch(OSversion.dwPlatformId) { case VER_PLATFORM_WIN32_NT: //If windows NT(2K/Xp) is deteceted { // Set DCB // DCB dcb; GetCommState(hPort, &dcb);
if (!SetCommTimeouts(hPort, &CommTimeOut)) MessageBox("Setting CommTimeOut error!", "PW-Test Error Message", NULL);
break;
}
//If older versions of windows is detected(windows98) case VER_PLATFORM_WIN32s || VER_PLATFORM_WIN32_WINDOWS: { // Set timeouts COMMTIMEOUTS CommTimeOut;
//If the windows version is unknown default: { AfxMessageBox("Unknown Windows version detected!", MB_ICONSTOP); break;
}
}
EscapeCommFunction(hPort,CLRDTR); // Turn off power to module } return hPort; }
Det skal lige siges at det ikke er mig der har lavet programmet i sin tid, men er sat til at løse denne fejl :) Så bare with me, hvis jeg ikke lige kan svare på jeres spørgsmål, hvis i da har sådan nogle :D
Hvis jeg skulle komme med et gæt, ville det være at man sender en besked til MP'en, og straks derefter forsøger at læse fra porten, uden at MP'en har haft tid til at svare.
Når du så kører programmet anden gang, er dataene løbet ind på porten og er klar til at blive læst.
Ja, en Sleep vil typisk være det du bruger til at forsinke eksekvering i et Windows program. Det kan du så sætte ind lige efter der er blevet sendt data til enheden.
else { switch(OSversion.dwPlatformId) { case VER_PLATFORM_WIN32_NT: //If windows NT(2K/Xp) is deteceted { // Set DCB // DCB dcb; GetCommState(hPort, &dcb);
//If older versions of windows is detected(windows98) case VER_PLATFORM_WIN32s || VER_PLATFORM_WIN32_WINDOWS: { // Set timeouts COMMTIMEOUTS CommTimeOut;
//If the windows version is unknown default: { AfxMessageBox("Unknown Windows version detected!", MB_ICONSTOP); break;
}
}
EscapeCommFunction(hPort,CLRDTR); // Turn off power to module } return hPort; }
Grunden til at den ekstra kode er, at jeg tjekker på hvilket OS programmet kører på, og så bliver COMporten sat op som den skal, eller det urde den i hvert fald :)
Jeg tror det er i metoden: StartTest(hPort); at selve kommunikationen foregår. Prøv at se efter kald til ReadFile og WriteFile med hPort som parameter.
Deri bliver ReadFile kaldt, det er det eneste sted jeg lige kan se der bliver brugt ReadFile. Den der nInQue bliver sat sådan her, i en tidligere del af koden.
Nevermind.. jeg fik det til at virke.. Kørte bare en funktion 2 gange i stedet.. det løste problemet..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.