hello
here is a part of code i use for read data from a laser sensor through a
serial port.
it is a rtmodule code
i just use inb and outb function to read and write on the serial port
init_laser_linux.c  is a code to read and write the serial port but not in a
rtmodule
i hope it can help you...


=?iso-8859-1?Q?Jo=E3o?= Coimbra a ecrit:

> Ola!
>
> Se for possivel disponibilizar o codigo exemplo, agradecia
>
>          Joao Coimbra
>
> At 14:57 06-07-2001 +0200, you wrote:
> >Ola!...
> >
> >Podes perfeitamente ler o sonnar pela porta serie se o sonnar
> >disponibilizar uma ligacao serie!... Tenho estado a trabalhar num sistema
> >GPS ligado a porta serie e que e lido em Linux, as informacoes sao depois
> >passadas para o modulo RTLinux atraves de uma fifo, se quiseres mais
> >informacoes ou o codigo exemplo diz!
> >
> >Sergio Rui Silva
> >
> >FEUP
> >
> >On Sat, 4 Aug 2001, [iso-8859-1] Joao Coimbra wrote:
> >
> > > Hi all how can I read a sonnar through a serial port (rs-232
> > > communication)? There is some example to help me?
> > > Thank you !!!
> > >
> > > -- [rtl] ---
> > > To unsubscribe:
> > > echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> > > echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> > > --
> > > For more information on Real-Time Linux see:
> > > http://www.rtlinux.org/
> > >
> >
> >-- [rtl] ---
> >To unsubscribe:
> >echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> >echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> >--
> >For more information on Real-Time Linux see:
> >http://www.rtlinux.org/
>
> ----- End of forwarded message from [EMAIL PROTECTED] -----
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> --
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/

def_moxa.h



/************************ acquisition donnees laesr sur com1 par interruption 
*************************/



#include <rtl_sync.h>
#include <rtl_core.h>
#include <rtl.h>
#include <asm/io.h>
#include <time.h>
#include <pthread.h>
#include <rtl_fifo.h>
#include <rtl_sched.h>

#include "def_moxa.h"

#define adresse_base_com1 COM1

WORD dll_com1 = adresse_base_com1 + DLL;
WORD dlm_com1 = adresse_base_com1 + DLM;
WORD ier_com1 = adresse_base_com1 + IER;
WORD lcr_com1 = adresse_base_com1 + LCR;        

hrtime_t debut_com1;
int i_com1=0, j_com1=0;
int passage_com1=0;
unsigned int somme_scan=0;
int resultat[4];
unsigned char crc_calcule,scan[12];



unsigned int handler_com1(void)
{ unsigned char temp;
  unsigned int nouveau_debut=1;
  int test_rtf;
  hrtime_t temps_com1, tampon_temps_com1;
  double temps;

  outb(0x00,ier_com1);        /* instruction necessaire avec la moxa */
  temp = inb(adresse_base_com1);




 if(temp==0x0D)
 {       somme_scan=somme_scan-scan[11];
         crc_calcule=256-(somme_scan%256);

         if ( crc_calcule==scan[11])
         {       resultat[0]=(scan[3]*256+scan[4])-(scan[2]*256);
                 resultat[1]=(scan[6]*256+scan[7])-(scan[5]*256);
                 resultat[2]=scan[8]*256+scan[9];
                 resultat[3]=scan[10];
                 i_com1=0;
                 somme_scan=0;
                 crc_calcule=0;

                 tampon_temps_com1=clock_gethrtime(CLOCK_REALTIME);
                 temps_com1=tampon_temps_com1-debut_com1;
                 temps=(double)(temps_com1/1000000);
                 debut_com1=clock_gethrtime(CLOCK_REALTIME);
                 rtl_printf("\n robosense %ld",(long int)temps);
                
           //      rtl_printf("\n  position : X= %d Y= %d TETA= %d confiance= 
%d\n",resultat[0],resultat[1],resultat[2],resultat[3]);
          }
          else
          {       i_com1=0;
                  somme_scan=0;
                  crc_calcule=0;
          }
 }
 else
 {       if(temp==0xF2)
         {       if(scan[i_com1-1]==0x1B)
                 {       i_com1--;
                         scan[i_com1]=0x0D;
                         i_com1++;
                         somme_scan=somme_scan+scan[i_com1-1];
                 }
                 else
                 {
                         scan[i_com1]=temp;
                         i_com1++;
                         somme_scan=somme_scan+scan[i_com1-1];
                 }
         }
         else
         {        if( (temp==0xE4  && scan[i_com1-1]!=0x1B) || (temp!=0xE4) )
                  {
                         scan[i_com1]=temp;
                         i_com1++;
                         somme_scan=somme_scan+scan[i_com1-1];
                  }
         }
 }




  outb(0x01,ier_com1);        /* instruction necessaire avec la moxa */
  rtl_hard_enable_irq(4);

  return 0;
}




int init_module(void)
{

        int  Erreur = 0;
        BYTE i,tampon;

        
        rtl_irqstate_t f_com1;
        int test_irq=0;
        
        /* Nettoyage du port */
        for (i=0;i<=6;i++)
                inb(adresse_base_com1);
        
        /*initialisation de la carte */
                
        outb(0x00,ier_com1);                    /* disable l'IT reception */
                /* Initialisation de la vitesse de communication */
        outb(0x80,lcr_com1);  /* LCR.7 = 1 */
        outb((0x02 & 255),dll_com1);  /* partie basse */         /*         0x02 =  
56700 BPS             \ */
        outb((0x02 >> 8),dlm_com1);   /* partie haute */
                /* Initialisation de la largeur du caractere, du bit de stop
        et de la parite */
        outb((  BIT_8 | (0 << 2) | (P_AUCUNE << 3) ),lcr_com1 );
        
        outb(0x02,adresse_base_com1 +2);        // Raz FIFO
        outb(0x01,adresse_base_com1 +2);        // val. FIFO mode DMA
        outb(0x01,ier_com1);                    /* enable l'IT reception */
        inb(adresse_base_com1);   /* On vide RXD */
        inb(adresse_base_com1);

        
         debut_com1=clock_gethrtime(CLOCK_REALTIME);

        rtl_no_interrupts(f_com1);


        rtl_request_irq(4,handler_com1);
        rtl_printf("\n test test_request_irq %d",test_irq);

        rtl_hard_enable_irq(4);


        rtl_restore_interrupts(f_com1);


        return 0;
}



void cleanup_module(void)
{
  rtl_free_irq(4);
}
include ../../rtl.mk

intr_robosense.o: intr_robosense.c
        $(CC) ${INCLUDE} ${CFLAGS} -c intr_robosense.c -o intr_robosense.o

all: intr_robosense.o
        @echo "insertion des rtl_modules"
        (cd ../../; scripts/insrtl)
        @echo "lancage du real-time tasks  module"
        @insmod intr_robosense.o

robosense: intr_robosense.o
        @echo "lancage du real-time tasks  module"
        @insmod intr_robosense.o

        
clean:
        rmmod intr_robosense
        (cd ../../; scripts/rmrtl)      

clean_r:
        rmmod intr_robosense
        
#include <stdio.h>
#include <asm/io.h>
#include "init_carte_linux.h"


void init_16552(WORD adresse_base,WORD vitesse)
{
        int  Erreur = 0;
        BYTE i,tampon;

        WORD dll = adresse_base + DLL;
        WORD dlm = adresse_base + DLM;
        WORD ier = adresse_base + IER;
        WORD lcr = adresse_base + LCR;


        
                /* Nettoyage du port */
                for (i=0;i<=6;i++)
                        inb(adresse_base);

                /* Initialisation de la vitesse de communication */
                outb(0x80,lcr);  /* LCR.7 = 1 */
                outb((vitesse & 255),dll);  /* partie basse */
                outb((vitesse >> 8),dlm);   /* partie haute */

                /* Initialisation de la largeur du caractere, du bit de stop
                et de la parite */
                outb((  BIT_8
                                                                        | (0 << 2)
                                                                        | (P_AUCUNE << 
3)
                                                                 ),lcr );

                outb(0X00,adresse_base+MCR);    /* pas de signaux de controle */


                outb(0x02,adresse_base +2);     // Raz FIFO
                outb(0x01,adresse_base +2);     // val. FIFO mode DMA
//              outb(adresse_base +2,0x09);     // val. FIFO mode DMA
//              outb(adresse_base +2,0x49);     // FIFO =16
                outb(0x00,ier);                         /* IT reception */

                inb(adresse_base);   /* On vide RXD */
                inb(adresse_base);


}


int envoie_fait(void)
{ unsigned char lecture;

        lecture=inb(COM3+LSR);
  if( (lecture&0x40)!=0 )
                return(1);
        else
                return(0);
}


int donnee_prete(void)
{       unsigned char lecture;
        
        lecture=inb(COM3+LSR);
        if( (lecture&0x01)==1)
                return(1);
        else
                return(0);
}

void lecture(unsigned char char_lu)
{       while(donnee_prete() !=1) ;
        char_lu=inb(COM3) ;
}

void ecriture(unsigned char char_envoi)
{       while(envoie_fait() !=1);
        outb(COM3,char_envoi);
}

Reply via email to