Preciso testar um aplicativo de porta serial no Linux, no entanto, minha máquina de teste possui apenas uma porta serial.
Existe uma maneira de adicionar uma porta serial virtual ao Linux e testar meu aplicativo emulando um dispositivo por meio de um shell ou script?
Nota: Não consigo remapear a porta, ela está codificada em ttys2 e preciso testar o aplicativo como está escrito.
pts
página de manual para obter detalhes.Complementando a resposta do @ slonik.
Você pode testar o socat para criar a porta serial virtual, executando o seguinte procedimento (testado no Ubuntu 12.04):
Abra um terminal (vamos chamá-lo de Terminal 0) e execute:
O código acima retorna:
Abra outro terminal e escreva (Terminal 1):
o nome da porta deste comando pode ser alterado de acordo com o pc. depende da saída anterior.
você deve usar o número disponível na área destacada.
Abra outro terminal e escreva (Terminal 2):
Agora, de volta ao Terminal 1, você verá a sequência "Teste".
fonte
link=/path/to/link
após cada declaração de dispositivo (após eco = 0). Assim, pode ser usado em testes automatizados. (como Slonik faz em sua resposta)socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0
./dev/ttyS0
vez de/dev/pts/1
?Use socat para isso:
Por exemplo:
fonte
Também existe o tty0tty http://sourceforge.net/projects/tty0tty/, que é um emulador de modem nulo real para linux.
É um módulo simples do kernel - um pequeno arquivo de origem. Eu não sei por que isso só deu certo no sourceforge, mas funciona bem para mim. A melhor coisa é que também emula os pinos de hardware (RTC / CTS DSR / DTR). Ele ainda implementa os comandos TIOCMGET / TIOCMSET e TIOCMIWAIT iotcl!
Em um kernel recente, você pode receber erros de compilação. Isso é fácil de consertar. Basta inserir algumas linhas na parte superior da fonte module / tty0tty.c (após incluir):
Quando o módulo é carregado, ele cria 4 pares de portas seriais. Os dispositivos são / dev / tnt0 a / dev / tnt7, onde tnt0 está conectado a tnt1, tnt2 está conectado a tnt3 etc. Você pode precisar corrigir as permissões de arquivo para poder usar os dispositivos.
editar:
Acho que fui um pouco rápido com meu entusiasmo. Enquanto o motorista parece promissor, parece instável. Não sei ao certo, mas acho que caiu uma máquina no escritório em que trabalhava em casa. Não posso verificar até voltar ao escritório na segunda-feira.
A segunda coisa é que o TIOCMIWAIT não funciona. O código parece ter sido copiado de algum código de exemplo "tiny tty". A manipulação do TIOCMIWAIT parece estar ativa, mas nunca é ativada porque está faltando a chamada correspondente para wake_up_interruptible ().
editar:
O acidente no escritório foi realmente culpa do motorista. Faltava uma inicialização e o código TIOCMIWAIT completamente não testado causou uma falha na máquina.
Passei ontem e hoje reescrevendo o motorista. Havia muitos problemas, mas agora funciona bem para mim. Ainda falta um código para o controle de fluxo de hardware gerenciado pelo driver, mas não preciso disso, porque eu mesmo gerenciarei os pinos usando TIOCMGET / TIOCMSET / TIOCMIWAIT no código do modo de usuário.
Se alguém estiver interessado na minha versão do código, envie-me uma mensagem e eu a enviarei.
fonte
Você pode querer dar uma olhada no Tibbo VSPDL para criar uma porta serial virtual linux usando um driver Kernel - parece bastante novo e está disponível para download agora (versão beta). Não tenho certeza sobre a licença neste momento ou se eles querem disponibilizá-la comercialmente somente no futuro.
Existem outras alternativas comerciais, como http://www.ttyredirector.com/ .
Em código aberto, o Remserial (GPL) também pode fazer o que você deseja, usando PTYs do Unix. Ele transmite os dados seriais em "formato bruto" para um soquete de rede; A configuração de parâmetros do terminal do tipo STTY deve ser feita ao criar a porta, alterando-os posteriormente, como descrito na RFC 2217, não parece ser suportado. Você poderá executar duas instâncias remseriais para criar um modem nulo virtual como com0com, exceto que você precisará configurar a velocidade da porta, etc.
O Socat (também GPL) é como uma variante estendida do Remserial com muitas outras opções, incluindo um método "PTY" para redirecionar o PTY para outra coisa, que pode ser outra instância do Socat. Para notas de unidade, o socat é provavelmente melhor do que remserial, porque você pode direcionar arquivos diretamente para o PTY. Veja o exemplo PTY na página de manual. Existe um patch em "contrib" para fornecer suporte ao RFC2217 para negociar configurações de linha serial.
fonte
Usando os links publicados nas respostas anteriores, codifiquei um pequeno exemplo em C ++ usando uma porta serial virtual. Enviei o código para o GitHub: https://github.com/cymait/virtual-serial-port-example .
O código é bastante auto-explicativo. Primeiro, você cria o processo mestre executando ./main master e ele será impresso para stderr que o dispositivo está usando. Depois disso, você invoca ./main slave device, em que device é o dispositivo impresso no primeiro comando.
E é isso. Você tem um link bidirecional entre os dois processos.
Usando este exemplo, você pode testar o aplicativo enviando todos os tipos de dados e ver se funciona corretamente.
Além disso, você sempre pode vincular o dispositivo a um link simbólico, para não precisar recompilar o aplicativo que está testando.
fonte
Você seria capaz de usar um adaptador USB-> RS232? Eu tenho alguns, e eles apenas usam o driver FTDI. Então, você poderá renomear / dev / ttyUSB0 (ou o que for criado) como / dev / ttyS2.
fonte
Eu posso pensar em três opções:
Implementar RFC 2217
O RFC 2217 cobre uma porta de comunicação com o padrão TCP / IP que permite que um cliente em um sistema emule uma porta serial para os programas locais, enquanto envia e recebe de forma transparente dados e sinais de controle para um servidor em outro sistema que realmente possui a porta serial. Aqui está uma visão geral de alto nível .
O que você faria é encontrar ou implementar um driver de porta de cliente que implementasse o lado do cliente do sistema no seu PC - parecendo ser uma porta serial real, mas na realidade transferindo tudo para um servidor. Você pode obter esse driver gratuitamente no Digi, Lantronix, etc, suportando seus servidores de porta serial reais e independentes.
Você implementaria o lado da conexão do servidor localmente em outro programa - permitindo que o cliente se conectasse e emitisse os dados e comandos de controle conforme necessário.
Provavelmente não é trivial, mas o RFC está disponível, e você pode encontrar um projeto de código aberto que implemente um ou ambos os lados da conexão.
Modifique o driver da porta serial linux
Como alternativa, a fonte do driver da porta serial para Linux está prontamente disponível. Pegue isso, limpe as peças de controle de hardware e faça com que um driver execute duas portas / dev / ttySx, como um loopback simples. Em seguida, conecte seu programa real ao ttyS2 e seu simulador ao outro ttySx.
Use dois cabos seriais USB <--> em um loopback
Mas a coisa mais fácil de fazer agora? Gaste US $ 40 em dois dispositivos USB de porta serial, conecte-os (modem nulo) e, na verdade, tenha duas portas seriais reais - uma para o programa que você está testando e outra para o seu simulador.
-Adão
fonte