Como listar portas seriais [RESOLVIDO]

1. Como listar portas seriais [RESOLVIDO]

William Lima
willdoidao

(usa Ubuntu)

Enviado em 09/10/2012 - 13:07h

Pessoal,

como faço para listar as portas seriais disponíveis no meu server? No shell digitaria:

ls /dev/tty*

E em C/C++?


  


2. Re: Como listar portas seriais [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/10/2012 - 16:51h

Você terá de fazer a mesma coisa que o shell faz internamente.

Tradicionamente existem dois caminhos: o de mais alto nível é usar glob() (leia a manpage na seção 3 do manual), e usar opendir()/readdir()/closedir() se quiser ter um controle mais direto (de novo, leia as manpages na seção 3).

Mais modernamente, existe também a função wordexp(), que faz exatamente as mesmas expansões do shell. Sua documentação também está na seção 3 do manual.


3. Re: Como listar portas seriais [RESOLVIDO]

William Lima
willdoidao

(usa Ubuntu)

Enviado em 09/10/2012 - 17:14h

Cara,

terial algum exemplo de uso? Fiquei boiando, estou querendo usar uma aplicação em C++ para listar todas as portas disponiveis, só não visualizei como usar as .h que vc indicou.


4. Re: Como listar portas seriais [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/10/2012 - 18:51h

No shell, digite "man 3 glob". Existe uma seção "EXAMPLE", que mostra como fazer, em C, exatamente a mesma coisa que o shell faz quando você digita "ls -l *.c ../*.c".

wordexp() também tem um exemplo na sua manpage.

opendir()/readdir()/closedir() não têm exemplos nas manpages do Linux (ao menos não na minha distribuição). Essas funções, que são usadas internamente pelas outras duas acima, são usadas de modo como segue.

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

void lista_arquivos_pdf(const char *dirname){
DIR *dir;
struct dirent *dir_entry;
int len;

if((dir=opendir(dirname))!=NULL){
while((dir_entry=readdir(DIR))!=NULL){
len=strlen(dir_entry.d_name);
/* Vê se os últimos quatro caracteres são ".pdf" */
if(len>=4 && strcmp(dir_entry.d_name+len-4, ".pdf")==0)
printf("%s/%s\n", dirname, dir_entry.d_name);
}
closedir(DIR);
}
else{
fprintf(stderr, "Nao foi possível ler o diretorio %s: %s.\n", dirname, strerror(errno));
}
}



5. Re: Como listar portas seriais [RESOLVIDO]

William Lima
willdoidao

(usa Ubuntu)

Enviado em 10/10/2012 - 10:59h

Cara,

To quase lá! Valeu mesmo pela ajuda e paciencia em ajudar e ensinar, tava pesquinsando os man's da vida e achei o dirent.h, ele quase fez o que preciso.
Se colocar somente o /dev ele funciona, agora se colocar /dev/tty ou /dev/tty* não vai, pode ver se consegue me ajudar?

Segue o código:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(void)
{

DIR *dir;
struct dirent *lsdir;

dir = opendir("/dev/tty*");

/* print all the files and directories within directory */
while ( ( lsdir = readdir(dir) ) != NULL )
{
printf ("%s\n", lsdir->d_name);
}

closedir(dir);

return 0;

}


6. Re: Como listar portas seriais [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/10/2012 - 14:00h

Veja minha mensagem anterior. As funções relacionadas a leitura de diretórios leem o diretório -- ou seja, quais arquivos existem nele. Cabe a você selecionar os arquivos que lhe interessam.

Quando você usa glob() ou wordexp(), você informa um diretório e uma regra de formação para os nomes do arquivos, e elas lhe devolvem uma lista dos itens que se enquadram em tais regras.


7. Re: Como listar portas seriais [RESOLVIDO]

William Lima
willdoidao

(usa Ubuntu)

Enviado em 10/10/2012 - 16:54h

Manolo,

Valeu pela paciencia e pela ajuda consegui resolver, como vc falou faltou fazer um filtro.

Agora ficou show! Valeu!!

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(void)
{

DIR *dir;
struct dirent *lsdir;

dir = opendir("/dev/");

/* print all the files and directories within directory */
while ( ( lsdir = readdir(dir) ) != NULL )
{
if((strncmp(lsdir->d_name, "tty",3)==0)) //compara as 3 primeiras letras
printf ("%s\n", lsdir->d_name);
}

closedir(dir);
return 0;
}