/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Handshaking fejlerved brug af serielporten
Fra : Kasper Døring


Dato : 14-11-01 16:22

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

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.

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.




 
 
Niels Erik Danielsen (14-11-2001)
Kommentar
Fra : Niels Erik Danielsen


Dato : 14-11-01 19:18


"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.
>
>
>



Thorbjørn Ravn Ander~ (14-11-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 14-11-01 22:55

"Kasper Døring" <kasper@mip.sdu.dk> writes:

> 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
>
> Denne metode virker fint - i et stykke tid. Til tider overhører PC'en et
> Acknowledge og så hænger processen.

Jeg ved ikke en brik om Windows i denne sammenhæng, men er der
mulighed for at sætte en timeralarm på (eller et timeout på kaldet) så
din process kommer til live igen?

--
Thorbjørn Ravn Andersen "...plus...Tubular Bells!"
http://bigfoot.com/~thunderbear

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste