C++ e comunicação serial

506 views
Skip to first unread message

Alessandro Bispo dos Santos

unread,
Sep 8, 2011, 1:52:57 PM9/8/11
to ccppb...@googlegroups.com
Boa tarde lista, é o seguinte: Eu estou envolvido em um pequeno projeto, que consiste em efetuar a comunicação com uma pequena placa, usando C++ (Boost) e a porta RS232, de 9 pinos. Nessa placa há 2 leds, um conectado ao pino 4 da porta serial e o outro conectado ao pino 7. O que eu preciso fazer é piscar esses leds, dependendo do comando que um programa rodando em 2º plano envia para a porta. Ou seja, os leds algumas vezes vão piscar independentemente entre si.

Entretanto eu tenho pesquisado e li que, pelo menos desse modo, não é possível manipular o sinal dos pinos da porta de forma independente. Então antes de começar gostaria de saber se é possível fazer isso.

Antecipadamente grato.

--
Unix is sexy:
# unzip; strip; touch; grep; finger; mount; fsck; more; yes; umount; sleep

"Credulity kills." Carl Sagan

Linux User #403949

Thiago A. Corrêa

unread,
Sep 8, 2011, 2:02:43 PM9/8/11
to ccppb...@googlegroups.com
Olá,

Simplificando, você quer controlar o DTR e o RTS independentemente, certo?
Sim, é possível.

No windows:

void SerialPort::setRTS( bool value )
{
if ( isOpen() )
{
QMutexLocker locker( &d->mutex );
if ( value )
::EscapeCommFunction( d->handle, SETRTS );
else
::EscapeCommFunction( d->handle, CLRRTS );
}
}

void SerialPort::setDTR( bool value )
{
if ( isOpen() )
{
QMutexLocker locker( &d->mutex );
if ( value )
::EscapeCommFunction( d->handle, SETDTR );
else
::EscapeCommFunction( d->handle, CLRDTR );
}
}

No linux:
void SerialPort::setRTS( bool value )
{
if ( d->fd != -1 )
{
QMutexLocker locker( &d->mutex );
int status = 0;
::ioctl( d->fd, TIOCMGET, &status );
if ( value )
status |= TIOCM_RTS;
else
status &= ~(TIOCM_RTS);
::ioctl( d->fd, TIOCMSET, &status );
}
}

void SerialPort::setDTR( bool value )
{
if ( d->fd != -1 )
{
QMutexLocker locker( &d->mutex );
int status = 0;
::ioctl( d->fd, TIOCMGET, &status );
if ( value )
status |= TIOCM_DTR;
else
status &= ~(TIOCM_DTR);
::ioctl( d->fd, TIOCMSET, &status );
}
}


Att.
Thiago A. Correa

2011/9/8 Alessandro Bispo dos Santos <pro...@gmail.com>:

> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~---------------------------------~----------~--~----~
> [&] Colabore com a Pesquisa de Preferência de Conteúdo
> para Eventos do Grupo C & C++ Brasil:
> http://www.surveymonkey.com/s/GBBGTXN
> ------~----~-------~---~---~---~---~----------------~------------~---------~
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
> Emprego & carreira: vag...@ccppbrasil.org
> http://groups.google.com/group/dev-guys?hl=en
>

Alessandro Bispo dos Santos

unread,
Sep 8, 2011, 2:34:38 PM9/8/11
to ccppb...@googlegroups.com
Obrigado Thiago, já tive uma idéias aqui, obrigado pela ajuda.
Reply all
Reply to author
Forward
0 new messages