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