Pergunta

Preciso enviar e receber dados por conexões seriais (RS-232 e RS-422).

Como configuro e me comunico com essa conexão?Como faço para descobrir quais são as definições de configuração (por exemplo,taxa de transmissão) deve ser e como posso defini-los?

Em particular, estou procurando fazer isso em Java, C/C++ ou em um dos principais shells Unix, mas também tenho algum interesse em programação serial usando Windows/Hyperterminal.

Foi útil?

Solução

Construir uma máquina do tempo e voltar a 1987?Ho-ho.

Ok, chega de comentários sarcásticos.

Como faço para descobrir quais são as definições de configuração (por exemplo,taxa de transmissão) deve ser...

Ler a ficha técnica?Ok, ok.Sério, último.Se você não sabe a taxa de transmissão do dispositivo com o qual está tentando se comunicar, você tem duas opções.Comece a adivinhar ou possivelmente abra um o-scope.Se você precisar de um bom ponto de partida, sugiro 9600-8-N-1.Minha suspeita é que você pode chegar lá com força bruta de forma relativamente rápida.Há uma terceira opção de ter um ninja da velha escola que pode dizer, apenas pela VISUALIZAÇÃO dos caracteres distorcidos, em alguma taxa de transmissão padrão, qual é a taxa de transmissão real.Um truque de festa impressionante, com certeza.

Esperamos que você tenha acesso a essas informações.No unix/linux, você pode obter o minicom para brincar diretamente com a porta serial.Isso deve tornar bastante rápido a definição da configuração.

um dos principais shells Unix

No Unix, as portas seriais são mapeadas por arquivo no subdiretório /dev/.ttyS0, por exemplo.Se você configurar a taxa de transmissão correta e outros enfeites usando o minicom, poderá até enviar coisas para esse arquivo para enviar coisas para lá.

No cerne da questão, você pode acessá-la programaticamente por meio dos cabeçalhos POSIX.termios.h é o grande problema.

Ver: http://www.easysw.com/~mike/serial/serial.html#3_1 (NÃO ESTÁ MAIS DISPONÍVEL)

mas também tenho algum interesse em programação serial usando Windows/Hyperterminal.

Hyperterminal e minicom são basicamente o mesmo programa.Quanto a como o Windows permite acessar a porta serial, deixarei essa pergunta para outra pessoa.Não faço isso no Windows desde os dias do Win95.

Outras dicas

Se você deseja codificar em Java eu ​​realmente recomendo SerialIOs Porta serial.É muito fácil de usar e economiza dias de trabalho.Nunca encontrei uma biblioteca de código aberto tão boa quanto a SerialIO, REALMENTE!

Meu conselho:não use a estrutura IO serial da Sun!É de 1998 e cheio de bugs.Você pode usar rxtx mas serialio é melhor!

Para C/C++ no Windows você tem (pelo menos) duas opções:

  1. Use a classe SerialPort fornecida pelo .NET.
  2. Use a API Win32.Há um extenso artigo do MSDN que remonta a 1995 e muitas bibliotecas e exemplos gratuitos na web para você começar.

A opção .NET será muito mais fácil.

Se precisar ser multiplataforma, sugiro dar uma olhada no Boost Ásio.

No trabalho, usamos teraterm e realterm para verificar se os dados seriais estão formatados corretamente.Também temos um divisor de hardware com um switch para que possamos monitorar o tráfego para nossa aplicação através de um cabo de volta para outra porta.

O Windows permite acesso à porta serial via CreateFile.Isso lhe dá um controle e a partir daí você pode configurar o acesso.

Há algum tempo, escrevi um aplicativo de tamanho decente para rotear conexões de um farm de modems até um endereço de rede TCP/IP.

Inicialmente procurei uma biblioteca Serial IO desimpedida (gratuita).Tentei Sun, IBM e RxTx.Eles foram bons no desenvolvimento do aplicativo e nos testes iniciais, mas na produção cada um deles se mostrou instável.

Finalmente paguei pelo SerialPort do SerialIO.A conversão foi literalmente um exercício de mudança de importações, e a biblioteca foi absolutamente sólido como uma rocha - não posso recomendar o suficiente.Meu aplicativo está em execução em campo 24 horas por dia, 7 dias por semana, há alguns anos, sem nenhum problema encontrado por vários clientes.

Se você começar o desenvolvimento usando SerialPort, eles terão uma API melhor e eu a usaria.

Se você precisar de suporte multiplataforma, Java com SerialPort foi a melhor escolha que encontrei.

Por último, seu licenciamento é bastante razoável, desde que você não pré-instale software no equipamento para seu(s) cliente(s).

Por outro lado, se você quiser fazer isso usando C#, que rodará em Windows e Linux - com algumas limitações (EDITAR:que pode estar desatualizado.Não tenho como testar.).Basta criar um Porta serial objeto, defina sua taxa de transmissão, porta e quaisquer outras configurações estranhas, chame open nele e escreva seus bytes[]s.Depois de toda a configuração, o objeto SerialPort age de forma muito semelhante a qualquer fluxo de rede, portanto deve ser fácil de descobrir.

E como afirma ibrandy, você precisa conhecer todas essas configurações, como a taxa de transmissão, antes mesmo de começar a tentar se comunicar com qualquer dispositivo serial.

Dependendo do dispositivo com o qual você está tentando se comunicar, pode haver mais parâmetros do que taxa de transmissão, número de bits de dados, tipo de verificação de paridade e número de bits de parada a serem considerados.Se bem me lembro, os modems usam nove linhas da interface RS-232C.Alguns dispositivos como, por exemplo, caixas registradoras, podem usar handshake de hardware em linhas RTS/CTS ou em linhas DTR/STR.

Em geral é bom saber como funciona a interface.Você não pode se comunicar se a taxa de transmissão não corresponder, mas a configuração incorreta de outros parâmetros pode funcionar.Por exemplo, você pode enviar dados facilmente para o dispositivo esperando 1 bit de parada com 2 bits de parada definidos.Os problemas começam quando você tenta receber dados nesse caso.Você também pode usar o bit de paridade definido adequadamente como um dos bits de parada, etc.

Se você não é obrigado a usar um compilador específico sugiro usar Qt e na nova versão 5.3 você encontrará uma classe dedicada a portas seriais:

http://qt-project.org/doc/qt-5/qserialport.html

O código que você escreverá será executado em todas as plataformas Qt suportadas, pelo menos aquelas que possuem portas seriais.

Tenho usado purejavacomm:É uma implementação de javax.comm escrita em java puro + JNA

Ao contrário do rxtx, você não precisa instalar uma dll.Está escrito em Java + JNA puro, o que resolveu para mim o problema de portabilidade entre Windows e Linux.Deve ser fácil portar para outros sistemas operacionais compatíveis com JNA, como Solaris e FreeBSD, mas ainda não tentei.

Você pode esperar que uma biblioteca Java pura fique atrás de uma implementação nativa, como rxtx, no desempenho, mas com CPUs modernas, o gargalo é muito provável que seja a taxa de bits da sua porta serial, não os ciclos da CPU.Além disso, é muito mais fácil depurar do que uma biblioteca Java/Nativa mista ou código nativo compilado puro.

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