Potřebujete-li udělat chytré zařízení, které si samo zdetekuje nastavenou rychlost portu, je tahle rutina přesně to co potřebujete..
Rychlosti na RS 232 jsou voleny řadou, kdy vyšší rychlost je vždy dvojnásobkem té nižším, díky tomu není detekce rychlosti zrovna banální záležitost..
Metod na detekci rychlosti RS232 existuje mnoho, ale každá má svoje pro a proti.
Buď má vaše aplikace SW podporu na vysílací straně a vysílá určený znak, ale potom tato podpora může většinou nastavit rychlost, jako potřebujete a rutina ztrácí smysl..
Pokud se vysílá sekvence např. 10 stejných znaků, lze s trošku složitějším SW rychlost také snadno zdetekovat, ale to také není příliš obvyklý případ…
Zde uvedená rutina měří dobu průběhu jediného znaku. Nevýhodou je, že bude fungovat pouze u zařízení, kde máte možnost odvysílat jediný znak.
U opačných případů, kde detekujete rychlost ze souvislého toku dat použijte metodu postupného zvyšování rychlosti vždy, když náběžná, nebo sestupná hrana pulsu přijde v době zhruba poloviny očekávané doby. Tento způsob dá ale od cca 9.600 Bd procesoru X51 docela zabrat a od jisté hranice to nelze realizovat bez HW podpory.
Pokud máte napsanou SW rutinu, která umí detekovat rychlost ze souvislého toku dat, pošlete nám ji..
;***************************************************************************** ; &nbs p; Automatic Baud Rate Detection Test ;***************************************************************************** $Title(Automatic Baud Rate Detection Test) ;***************************************************************************** RX BIT
P3.0 ;Location of serial receive pin.
;***************************************************************************** ORG 8000h Start: ACALL
AutoBaud ;Go try to get a baud rate value. ;***************************************************************************** ; AutoBaud Rate Detect Routine. AutoBaud: MOV
TMOD,#01h ;Initialize timer 0 (UART baud rate timer).
MOV CharH,#0 ;Initialize timer result. AB0: JB
RX,AB0 ;Wait for serial start bit. AB1: JB
TF0,AB3 ;Check for timer overflow.
MOV CharH,TH0 ;Capture timer value at this serial edge.
AB2: JB
TF0,AB3 ;Check for timer overflow. AB3: CLR
TR0 ;Maximum sample time has expired, check
result.
MOV BaudRate,#19 ;Set up table pointers. CmpLow: MOV A,BaudRate
CmpMatch: MOV
A,BaudRate ;Comparison complete, ; Compare table holds timer values for the transition points of
the accepted CmpTable: END |