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);
}