"Kasper Døring" <kasper@mip.sdu.dk> wrote in message
news:9stuef$11gm$1@news.net.uni-c.dk...
> Hej
>
> Jeg har problemer med stabiliteten af serielkommunikationen under Windows
> 2000 og VC++ V6.0. Jeg er ved at skrive en applikation der kommunikerer
med
> en ekstern hardware enhed (en robot controller) via COM porten. Programmet
> er meget simpelt:
>
> 1) Send en 3 bytes komando til robot controlleren.
> 2) Vent på en 1 byte Acknowledge.
> 3) Goto 1
Dette er en meget simpel stop and wait protokol hvor der næsten ikke kan gå
noget galt, ud over et par småting
Du skal vide at det fysiske lag aldrig er helt ufejlbarlig, der kan komme
støj/extra bytes, og data kan gå tabt, eller ændret.
Jeg har set forskellige problemer med cosstalk hvor transmition af tegn gav
garbage i modtage bufferen.
Prøv at tømme modtage bufferen før du sender næste kommando, eller evt. lige
efter at data er sendt. (Hmm...ikke så smart)
Ellers vil der ske det hvis der f.eks. allerede ligger 5 bytes i modtage
bufferen, vil du modtage en 6 byte som bliver lagt sidst i bufferen.
Men hvis du kun læser 1 byte fra bufferen adgangen vil du få Acknowledge fra
5 kommandoer siden, hvilket er forvirende.
Bruger du nogen form for hardware handshake eller XON/XOFF ?
> Denne metode virker fint - i et stykke tid. Til tider overhører PC'en et
> Acknowledge og så hænger processen.
> Jeg bruger den "almindelige" metode til at åbne porten og sende/modtage
> data:
> CreateFile, ReadFile, WriteFile. Porten er åbnet for NON OVERLAPPED
> operation ved 38400bps, 8 databits, 1 stopbit og ingen paritet.
Hvad sætter du timeout til ?
Eks.
m_CommTimeouts.ReadIntervalTimeout=0;
m_CommTimeouts.ReadTotalTimeoutMultiplier=0;
m_CommTimeouts.ReadTotalTimeoutConstant=m_Timeout;
m_CommTimeouts.WriteTotalTimeoutMultiplier=0;
m_CommTimeouts.WriteTotalTimeoutConstant=m_Timeout;
SetCommTimeouts(m_SerialPort,&m_CommTimeouts);
Du kan feks. sætte timeout til 100ms, så vil readfile retunere efter 100 ms.
selvom den ikke har læst det antal tegn du har bedt den om at læse.
Eks.
ReadFile(m_SerialPort,(void
*)lpBuffer,nNumberOfBytesToRead,&nNumberOfBytesRead,NULL);
Hvis nNumberOfBytesToRead er forskellig fra nNumberOfBytesRead, så har du en
timeout.
>
> Hvordan gøres stabil handshaking normalt (Jeg håber ikke at jeg er den
> eneste der bruger handshaking)?
> Findes der en anden (bedre) måde at åbne og bruge COM porten.
>
>
> På forhånd tak,
> Kasper Døring.
>
>
>