Communication série rs232 avec interruptions

Soyez le premier à donner votre avis sur cette source.

Vue 14 919 fois - Téléchargée 805 fois

Description

Ce code permet la communication série entre deux PCs. Lors de la reception d'un nouveau caractère sur la liaison série, l'interruption IRQ4 se déclenche, et une routine prend en charge son traitement. Une interruption est aussi générée dans le cas d'une erreur de réception.

Source / Exemple :


.386

donnees segment

;;;;;;;;;;;;;;; Port COM ;;;;;;;;;;;;;;;;;;;;

commprt equ     03F8h           ; adresse de base du com1
THR     equ     commprt         ; THR
DL_LSB  equ     commprt         ; divisor latch LSB
DL_MSB  equ     commprt+1       ; divisor latch MSB
IER     equ     commprt+1       ; IT enable
IIR     equ     commprt+2       ; IT identification
FCR     equ     commprt+2       ; Fifo ctrl register
LCR     equ     commprt+3       ; ctrl ligne
MCR     equ     commprt+4       ; ctrl modem
LSR     equ     commprt+5       ; status ligne
MSR     equ     commprt+6       ; status modem

;;;;;;;;;;;;;;; Controlleur d'interruption ;;;;;;;;;

interr  equ     21h

donnees ends

pile    segment stack
        dw      80      dup(?)
pile    ends

code	segment use16

assume cs:code,ds:donnees
prog    proc    far

        ;;;;;;;;;;;;; Sauvegarde des registres ;;;;;;;;;;;;;;;

        push    ds
        push    es
        push    ax
        push    si
        push    dx

        ;;;;;;;;;;;;; Initialisation des registres de segments ;;;;;;;;;;;;;;;;;;

        mov     ax,donnees
        mov     ds,ax
        mov     es,ax

        ;;;;;;;;;;;;; détournement de l'IRQ4 ;;;;;;;;;;;;;;;;;

        cli                     ; désactive les interruptions
	xor	ax,ax
        mov     fs,ax           ; fs = 0
        mov     dx,interr
        in      al,interr       ; lecture du masque d'interruption
        and     al,0EFh         ; démasque l'IRQ4
        out     dx,al           ; écriture du masque
        mov     ax,cs           ;
	shl	eax,16		; eax = cs00h
        mov     ax,offset irq4  ; eax contient segment et offset de la nvlle routine d'interruption
        mov     fs:[0Ch*4],eax  ; détourne l'irq4

        ;;;;;;;;;;;;; Initialisation du port COM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        mov     al,80h          ; DLAB=1
        mov     dx,LCR
        out     dx,al
	
        mov     al,0Ch          ; 9600 bits/s
        mov     dx,DL_LSB
        out     dx,al
	xor	al,al
        mov     dx,DL_MSB
        out     dx,al
	
        mov     al,03h          ; DLAB=0, 8 bits de données, 1 bit d'arrêt, aucune parité
        mov     dx,LCR
        out     dx,al
	
        mov     al,5           	; Active l'interruption donnee prete et l'interruption de changement du status de ligne
        mov     dx,IER
        out     dx,al

        sti                     ; Autorise les interruptions

        ;;;;;;;;;;;;; programme principal ;;;;;;;;;;;;;;;;;;;;;;
        

start:
        xor     si,si
        lea     dx,moi
        mov     ah,09h
        int     21h

loop1:
        xor     ax,ax           ; lecture d'un caractère
	int	16h
        call    send_char

        cmp     al,27           ; teste si touche=esc
        jz      fin	        ; sortir

        mov     dl,al           ; afficher le caractère
        mov     ah,02h
        int     21h

        jnz     loop1

send_quit:
        call    send_char
fin:
        pop     dx
        pop     si
        pop     ax
        pop     es
        pop     ds

        mov	ax,4C00h
	int	21h
prog    endp

irq4:                           
	push	ax
	push	dx
        push    ds
        
        ;;;;; Source de l'interruption ;;;;;;

        mov     dx,IIR
        in      al,dx
        and     al,6            ; conserver que bits 1 et 2
        test    al,6
        jz      erreur_ligne    ; erreur ligne

                                ; sinon donnée prête
        mov     dx,commprt      ; lit un caractère du tampon de réception
        in      al,dx

        mov     dl,al
        mov     ah,02h          ; l'affiche à l'écran
        int     21h
        jmp     fin_irq4

erreur_ligne:
        mov     dx,LSR          ; lecture de l'état de la ligne
        in      al,dx
        test    al,2            ; si bit 1 est = 1 => erreur overrun
        jz      overrun
        test    al,8
        jz      cadrage         ; si bit 3 est = 1 => erreur cadrage (forme)
        jmp     fin_irq4

overrun:
        lea     dx,overrun_msg
        mov     ax,cs
        mov     ds,ax
        mov     ah,9
        int     21h
        jmp     fin_irq4

cadrage:
        lea     dx,cadrage_msg
        mov     ax,cs
        mov     ds,ax
        mov     ah,9
        int     21h

fin_irq4:
        mov     al,20h          ; EOI
	out	20h,al
        pop     ds
	pop	dx
	pop	ax
	iret

overrun_msg     db "erreur overrun$"
cadrage_msg     db "erreur cadrage$"

;;;;;;;;;;;;; routine d'envoi d'un caracactère ;;;;;;;;;;;;;;;;

send_char proc near
        push    dx
        push    ax
        mov     dx,LSR
attend:
        in      al,dx
        test    al,20h
        jz      attend
        pop     ax
        mov     dx,commprt
        out     dx,al
        pop     dx
        ret
send_char endp
           

code	ends
        end     prog

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

edfed
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1 -
pour les choses obsoletes, il y a de quoi faire, je sui squasiment sur que le PC qui à servi a dire que ce code est obsolete, est obsolete lui aussi.
obsolete, c'est quand ça ne sert plus le systeme de consommation.
donc, tout est plus ou moins obsolete.

puis coder en asm, c'est obsolete aussi.
allez, dire que le code est obsolete montre bien l'etat d'esprit, achete un ecran plasma, ça aussi c'est obsolete.
alors cours acheter un eee, ça, c'est pas encore obsolete, mais ça ne vat pas tarder... :lol:
Iwoks
Messages postés
12
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
27 août 2012
1 -
D'ailleur, pour certains GPS's nous avons besoin du RS232. Et même pour le pilotage de certaines machines.
Donc programme très intéressant. Sur les premières applications RS232
nallno
Messages postés
14
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2008
-
ça on l'avait remarqué, mais l'obsolescence est comme beaucoup de choses toute relative et question de point de vue.

On me demande bien de fabriquer des claviers à sortie // .
("obsolètes" depuis 20 ans...)
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Me semble important de préciser que tout ceci est complètement obsolète depuis plus de 10 ans.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.