ajuda com classe porta serial. / threads

1. ajuda com classe porta serial. / threads

Laerte Junior
laertedj

(usa Fedora)

Enviado em 14/11/2007 - 10:39h

Olá pessoal,

Estou criando uma aplicação que necessita de comunicação serial. Minha duvida é:

Fazer uma função dataAvailable que a aplicação vai ler e que funciona como um buffer auxiliar.

A serial que implementei tem o "jeitão" abaixo:

Primeiro: Arquivo Serial1.h

#if !defined(_SERIAL_H)
#define _SERIAL_H

#define porta "/dev/ttyS0"
#define taxa B115200
//#define Tamanho_msg 256
#define LEN sizeof(mod)
#define pacotes 128


//#include "comunicacao.h"

class Serial {
public:

int open_dev();
int write_dev(unsigned char buf[], int len);
int read_dev();
//int read_dev (unsigned char buf[], int len);
int close_dev();
int dataAvailable(int iIn);
int fd;


private:
struct termios tio, old_tio; //parametros da serial
};

#endif //_SERIAL_H



Segundo arquivo: Serial1.cpp

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>

#include "Serial1.h"



using namespace std;
unsigned char mod[pacotes]; //modificar o tamanho do vetor para variar o tamanho da mensagem...
unsigned char buffer_recep[sizeof(mod)];

Serial serial; //classe serial...

int Serial::open_dev() //abrir porta serial
{
char* device_name = porta; // ->/dev/ttyS0

printf("\nvalor do fd depois: %d\n", fd);
fd = open(device_name, O_RDWR | O_NOCTTY); //abrindo serial
printf("\nvalor do fd antes: %d\n", fd);


if ( fd < 0)
{
printf("\nErro ao abrir a Serial !! \n");
return -1;
}
else
{
printf("\nSerial está OK!!! \n");

// seta parametros de baudrate, stop bit, etc

tio.c_cflag = taxa | CS8 | CLOCAL | CREAD | HUPCL;
tio.c_iflag = 0; //IGNBRK |IGNPAR;
tio.c_oflag = 0;
tio.c_lflag = 0;

tio.c_cc[VINTR] = 0; // Ctrl-c
tio.c_cc[VQUIT] = 0; // Ctrl-\
tio.c_cc[VERASE] = 0; // del
tio.c_cc[VKILL] = 0; // @
tio.c_cc[VEOF] = 0; // Ctrl-d
tio.c_cc[VMIN] = 1; // blocking read until 1 character arrives
tio.c_cc[VEOL] = 0; // '{TTEXTO}'
tio.c_cc[VTIME] = 1; // inter-character timer
tio.c_cc[VEOL2] = 0; // '{TTEXTO}'
tio.c_cc[VSTART] = 0; // Ctrl-q
tio.c_cc[VSTOP] = 0; // Ctrl-s
tio.c_cc[VSUSP] = 0; // Ctrl-z
tio.c_cc[VLNEXT] = 0; // Ctrl-v
tio.c_cc[VWERASE] = 0; // Ctrl-w
tio.c_cc[VREPRINT] = 0; // Ctrl-r
tio.c_cc[VDISCARD] = 0; // Ctrl-u


tcgetattr(fd, &old_tio);

cfsetispeed(&old_tio, taxa);
cfsetospeed(&old_tio, taxa);

tcflush(fd, TCIOFLUSH);
tcsetattr(fd, TCSANOW, &tio);
//até aqui parametros da serial...
return fd;
}
}



int Serial::write_dev(unsigned char buf[], int len){ //escrevendo na porta serial

ssize_t cont_write; // ssize_t: Tipo de dado usado para representar o número de blocos a ler ou escrever em uma operação read ou write.

printf("Vai ser enviado os caracteres:\n\n");
for(int i=0; i<len; i++){
printf(" %02x", mod[i]);
}

cont_write = write(fd, &mod, sizeof(mod));// verificar a mensagem a ser enviada...
printf("\nPassou pelo write_dev, com valor de bytes escritos = %d\n", cont_write);

usleep(30000); //tempo minimo necessario para ler 128 bytes a 115200bps
serial.read_dev(); //chamando a função read aqui...

if (cont_write < 0)
{
printf("Erro na escrita %d %s\n", errno, strerror(errno));
}
else
{
printf("\nFoi enviado %d caracteres:\n", cont_write);
/*for(int i=0; i<len; i++){
printf(" %02x", mod[i]);
}*/
}
return cont_write;
}




int Serial::read_dev(){

ssize_t cont_read;

printf("\nValor de cont_read antes do read: %d \n",cont_read);
cont_read = read(fd, &mod, sizeof(mod));//erro de leitura...
//criar um timeout aqui...
printf("\nPassou pelo read_dev...\n");
printf("\nValor de cont_read depois do read: %d \n",cont_read);

if((serial.dataAvailable(cont_read)) != 0){
printf("\n\nCaracteres recebidos com sucesso...\n");
/*for(int i=0; i<sizeof(mod); i++){
printf(" %02x", mod[i]);
}*/
return cont_read;
}
else{
printf("\n\nErro na recepção!!!\n\n");
return -1;
}
printf("\n");
}


int Serial::close_dev() //fecha a porta serial
{
int fechar_serial;
if (fd > 0)
{
fechar_serial = close(fd);
return fechar_serial;
}
}

int Serial::dataAvailable(int cont_read) {


}

Outra dúvida é: a função read deve ter um timeout ou rodar dentro de uma thread?????


Valeu



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts