Use este comando,
stty -F /dev/ttyS0
para obter todas as configurações da porta. Em seguida, veja o que mudou depois que a porta começar a funcionar.
Isso envolve o cygwin em execução no Windows XP. Eu tenho uma porta serial genuína (COM1) nesta máquina.
Após a inicialização, um programa que eu escrevi recebe respostas ilegíveis ao tentar se comunicar através da porta serial. Se eu executar o Hyperterminal e definir a taxa "baud", saia, tudo funciona normalmente a partir de então.
Eu primeiro tentei definir a velocidade do programa (usando chamadas termios) e isso não funcionou. Então eu decidi tentar mudar a velocidade usando um utilitário existente. Usando um comando como stty -F /dev/ttyS0 9600
é aceito, e se eu tentar uma velocidade diferente, posso ver a mudança quando eu examiná-lo com stty -F /dev/ttyS0
. Mas não tem efeito aparente na velocidade real.
Estou achando difícil imaginar que, se o cygwin não pudesse alterar as taxas de bits, não encontraria uma declaração nesse sentido na minha pesquisa. Mas eu não encontrei nada disso.
Suponho que poderia ser alguma configuração diferente de bits por segundo que precisa ser corrigida. Mas não vejo nada no relatório retornado para sugerir isso. Talvez eu teste isso tentando descobrir a que taxa se trata.
Edit: Eu verifiquei com um osciloscópio, e a taxa de transmissão (pelo menos, saindo), realmente muda para 9600 como eu pretendia. Então, agora vou olhar para outras configurações possíveis que podem interferir nas comunicações.
Solução: Uma coisa que ajudou muito foi a minha descoberta de que uma porta serial virtual USB reiniciaria a si mesma toda vez que fosse desconectada. Isso eliminou a necessidade de reinicializar o host para desfazer o que o HyperTerminal estava fazendo para corrigir o problema. Dessa forma, consegui fazer muitos testes em pouco tempo.
A solução veio quando encontrei o comando stty -F /dev/ttyS0 -a
para obter todos os parâmetros da porta. Eu o executei antes e depois de deixar o HyperTerminal "consertar" o problema, capturando a saída para os arquivos e, em seguida, usando os resultados do diff. Os resultados: cs7
. Esse é o número de bits em cada caractere. Algo inicializa as portas seriais para o N-7-1 por padrão. A solução, então, é tão simples quanto:
stty -F /dev/ttyS0 9600 cs8
Nota: O problema original começou com as chamadas termios. A mesma solução pode ser aplicada lá. Mas isso é uma questão a ser abordada no Stackoverflow.