Pergunta

Eu preciso testar uma porta serial do aplicativo no Linux, no entanto, a minha máquina de teste só tem uma porta serial.

Existe uma maneira para adicionar uma porta serial virtual para Linux e testar minha aplicação emular um dispositivo através de um shell ou script?

Nota:Eu não pode remapear a porta, ele codificados no ttys2 e eu preciso testar o aplicativo, como está escrito.

Foi útil?

Solução

Você pode usar uma pty ("pseudo-teletipo", onde uma porta serial é um real "teletipo") para isso.De um lado, abrir /dev/ptyp5, e , em seguida, anexar o seu programa /dev/ttyp5; ttyp5 irá atuar como uma porta serial, mas irá enviar/receber tudo o que ele faz através de /dev/ptyp5.

Se você realmente precisa dele para falar para um arquivo chamado /dev/ttys2, e , em seguida, basta mover o seu antigo /dev/ttys2 sair do caminho e fazer um link simbólico a partir de ptyp5 para ttys2.

Claro, você pode usar um número diferente ptyp5.Talvez pegar um com um número alto para evitar duplicatas, uma vez que todo o seu login terminais vão estar também a utilizar ptys.

A wikipédia tem mais sobre ptys: http://en.wikipedia.org/wiki/Pseudo_terminal

Outras dicas

Complementando o @slonik resposta.

Você pode testar socat para criar Porta Serial Virtual fazendo o seguinte procedimento (testado no Ubuntu 12.04):

Abra um terminal (vamos chamá-lo de Terminal 0) e executá-lo:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

O código acima retorna:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

Abra um outro terminal e escrever (Terminal 1):

cat < /dev/pts/2

este comando é o nome da porta pode ser alterada de acordo com a pc.ele depende da saída anterior.

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

você deve usar o número disponível na área realçada.

Abra um outro terminal e escrever (Terminal 2):

echo "Test" > /dev/pts/3

Agora, de volta para o Terminal 1 e você verá a string "Teste".

Use socat para isso:

Por exemplo:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

Há também tty0tty http://sourceforge.net/projects/tty0tty/ o que é uma verdadeira modem nulo emulador para linux.

Ele é um simples módulo de kernel - um pequeno arquivo de origem.Eu não sei por que ele só tem polegares para baixo no sourceforge, mas funciona bem para mim.A melhor coisa sobre ele é que é também emula o hardware de pinos (RTC/CTS DSR/DTR).Ele mesmo implementa TIOCMGET/TIOCMSET e TIOCMIWAIT iotcl comandos!

Em uma recente kernel que você pode obter erros de compilação.Isso é fácil de corrigir.Basta inserir algumas linhas na parte superior do módulo/tty0tty.de origem c (após a inclui):

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

Quando o módulo é carregado, ele cria 4 pares de portas seriais.Os dispositivos são /dev/tnt0 para /dev/tnt7 onde tnt0 está ligado a tnt1, tnt2 está ligado a tnt3, etc.Pode ser necessário corrigir as permissões do arquivo para ser capaz de usar os dispositivos.

editar:

Eu acho que foi um pouco rápido com o meu entusiasmo.Enquanto o motorista parece promissor, parece instável.Eu não sei com certeza, mas eu acho que ele caiu de uma máquina no escritório em que estava a trabalhar a partir de casa.Eu não posso verificar até que eu estou de volta no escritório na segunda-feira.

A segunda coisa é que TIOCMIWAIT não funciona.O código parece ser copiado a partir de alguns "pequenos tty" exemplo de código.O tratamento de TIOCMIWAIT parece no lugar, mas ele nunca acorda porque a chamada correspondente para wake_up_interruptible() está em falta.

editar:

A falha no escritório realmente era o motorista da culpa.Houve uma inicialização ausente, e completamente testada TIOCMIWAIT código causou uma falha da máquina.

Passei ontem e hoje reescrever o driver.Havia um monte de problemas, mas agora ele funciona bem para mim.Há ainda o código que falta para controle de fluxo de hardware gerenciado pelo controlador, mas eu não preciso disso porque eu vou estar gerenciando os pinos-me usando TIOCMGET/TIOCMSET/TIOCMIWAIT de código de modo de utilizador.

Se alguém estiver interessado em a minha versão do código, envie-me uma mensagem e eu vou enviá-lo para você.

Você pode querer olhar para Tibbo VSPDL para a criação de um linux de porta serial virtual usando um driver de Kernel -- parece muito novo, e está disponível para download agora (versão beta).Não tenho certeza sobre a licença a este ponto, ou se querem torná-lo disponível comercialmente apenas no futuro.

Há outros comerciais alternativas, tais como http://www.ttyredirector.com/.

No Código-Fonte Aberto, Remserial (GPL), também podem fazer o que quiser, usando Unix PTY s.Ele transmite a série de dados em "forma bruta" para um socket de rede;STTY-como a instalação de terminal de parâmetros deve ser feito quando criar a porta, mudando-los mais tarde, como descrito no RFC 2217 não parece ser apoiado.Você deve ser capaz de executar dois remserial instâncias para criar um virtual nullmodem como com0com, exceto que você precisará configurar a velocidade da porta, etc antecipadamente.

Socat (também GPL) é como um longo variante de Remserial com muitas mais opções, incluindo um "PTY" método para redirecionar o PTY para outra coisa, que pode ser outro exemplo de Socat.Para a Unidade de tets, socat é provavelmente mais agradável do que remserial porque você pode diretamente gato de arquivos no PTY.Ver o PTY exemplo na página de manual.Um patch existe em "contrib" para fornecer RFC2217 apoio para a negociação de série de configurações de linha.

Usando os links postados nas respostas anteriores, eu codificado um pequeno exemplo em C++ usando uma Porta Serial Virtual.Eu empurrei o código no GitHub: https://github.com/cymait/virtual-serial-port-example .

O código é bastante auto-explicativo.Primeiro, você cria o mestre de processo de execução ./principal mestre e ele irá imprimir a stderr o dispositivo está a utilizar.Depois que você chamar ./principais slave device, onde device é o dispositivo impresso no primeiro comando.

E é isso.Você tem uma relação bidirecional entre os dois processos.

Usando este exemplo, você pode testar o aplicativo através do envio de todo o tipo de dados, e veja se ele funciona corretamente.

Além disso, você pode sempre link simbólico para o dispositivo, então você não precisa re-compilar o aplicativo que você está testando.

Você seria capaz de usar um USB->RS232?Eu tenho alguns, e eles basta usar o driver FTDI.Em seguida, você deve ser capaz de mudar o nome de /dev/ttyUSB0 (ou tudo o que é criado) como /dev/ttyS2 .

Eu posso pensar em três opções:

Implementar RFC 2217

RFC 2217 cobre uma porta TCP/IP padrão que permite a um cliente em um sistema para emular uma porta serial para programas locais, enquanto que, de forma transparente, a transmissão e recepção de sinais de controle para um servidor em outro sistema, o que realmente tem a porta serial.Aqui está um visão geral de alto nível.

O que você deve fazer é encontrar ou implementar um cliente do driver de porta com que iria implementar o lado do cliente do sistema no PC, o que parece ser um verdadeiro porta serial, mas, na realidade, transportando tudo para um servidor.Você pode ser capaz de obter este controlador de graça da Digi, Lantroxix, etc., em suporte de seu real autônomo porta serial servidores.

Em seguida, você deverá implementar lado do servidor de conexão localmente em outro programa, permitindo que o cliente se conecte e emissão de dados e de comandos de controle, conforme necessário.

Provavelmente não trivial, mas a RFC está lá fora, e você pode ser capaz de encontrar um projeto de código aberto que implementa um ou ambos os lados da conexão.

Modificar o linux driver de porta serial

Como alternativa, a porta de origem do driver para Linux está prontamente disponível.Assumir que, o intestino, o hardware de controle de peças, e tem que um motorista executar dois /dev/ttySx portas, como um simples de loopback.Em seguida, conecte seu programa real para o ttyS2 e o seu simulador para o outro ttySx.

Usar duas USB<-->Os cabos seriais em um loopback

Mas a melhor coisa a fazer agora?Gastar us $40 em dois porta serial dispositivos USB, fio-los juntos (null modem) e, na verdade, ter duas portas seriais, uma para o programa que você está testando, um para o seu simulador.

-Adam

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top