Pergunta

Eu estou trabalhando em um programa utilitário do Windows que se comunica com algum hardware personalizado usando uma porta COM padrão. O protocolo de comunicação (que está fora do meu controle) me obriga a transmitir e receber matérias-bytes de dados de 8 bits.

Atualmente, estou usando a seguinte função API do Windows para enviar dados para a porta COM:

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

onde hFile é uma referência para a porta COM adequadamente aberto, e lpBuffer é uma matriz de bytes que foram armazenados na memória. O código funciona perfeitamente até que um caractere nulo (ASCII zero) deve ser enviado para o dispositivo. WriteFile pára de enviar assim que detecta o caractere nulo porque ele assume que atingiu o fim da cadeia. Isto acontece mesmo que eu definir numberOfBytesToWrite corretamente.

Como posso enviar dados brutos para a porta COM usando a API do Windows? Eu preferiria usar uma chamada API padrão semelhante ao WriteFile, mas estou aberto a sugestões.

Atualmente, estou usando RapidQ para construir o utilitário, mas tudo que faz é chamar a função API do Windows diretamente.

Editar: Minha configuração consiste em um PC Windows conectado via porta serial para o módulo de hardware personalizado. O módulo tem uma pequena tela em que eu sou capaz de ver os caracteres transmitidos. Eu testei esta configuração com outro programa utilitário de terceiros. Eu sou capaz de se comunicar com o módulo usando este programa de terceiros, e caracteres nulos aparecem corretamente. Em meu próprio programa, quando eu uso WriteFile, um lugar caractere nulo no fluxo de transmissão pára os restos do fluxo de serem enviados.

Foi útil?

Solução

Eu fiz o Windows porta serial programação antes, e tenho certeza que eu tenho sido capaz de enviar caracteres nulos através das portas seriais (vários protocolos de transferência de arquivos não teria funcionado de outra forma). Não consigo pensar em duas explicações possíveis:

  1. O receber dispositivo está a imprimir os dados recebidos usando um método que pára no primeiro caractere nulo. Como você está determinando que o dispositivo a transmitir está sendo finalizado no primeiro nulo? O problema poderia estar em algum lugar mais abaixo da linha?
  2. O driver serial está quebrado. Isto é bastante improvável, mas é uma possível explicação. Se você estiver usando alguma porta proprietária desonesto terceiros série e seus pilotos, então eles poderiam ser suspeito. Se você estiver usando um padrão built-in porta serial com os drivers Windows normal, então isso provavelmente não é um problema.

Eu só tinha um rápido olhar para RapidQ e há uma terceira explicação possível:

  1. O empacotamento que RapidQ pode fazer no processo de chamar funções da API Win32 pode ter problemas com caracteres nulos incorporados nos dados para enviar. Eu não sei nada sobre RapidQ, mas este é mais um elo na cadeia que deve ser considerado.

Outras dicas

Greg é provavelmente correta, mas também gostaria de verificar suas configurações de porta COM. Certifique-se de suas configurações DCB estão definidas corretamente. Olhe para cima SetCommState e GetCommState para obter informações.

Normalmente, Serial é 8N1, mas o dispositivo pode estar usando algum outro paridade, ou configuração bit de parada, etc.

Como Greg, eu fiz um monte de trabalho ao longo de série mim mesmo, e muitas vezes isso pode ser a fonte de problemas ... Tente falar com RS485 e uma estrutura DCB incorreta ... heh ..

Larry

PS: Se você não tiver um, eu recomendo obter-se uma boa caixa de break-out serial. Eu tenho um em algum lugar ao redor da casa, e vai mostrar o que são todos os sinais, em todas as linhas durante todas as suas comunicações, e é uma ferramenta de depuração muito poderoso.

Eu tenho usado WriteFile no passado e funcionou muito bem com bytes nulos. Eu cavar RapidQ, que poderia ser o problema.

Se nada disto ajuda, você sempre pode fazer o que faço. código COMM do uso Greg para testar o dispositivo com. Lembre-se Qmodem? :) Very nice ferramenta para testes / depuração rotinas serial. Você ccould mesmo usar Qmodem e um simples Qmodem script para ler a porta COM em outra caixa (ou outra porta na mesma caixa), e imprimir o valor hexadecimal de todos os enviados de char. Oh espere. Qmodem tem que construiu em. :) Use a emulação ASCII Debug e ele vai mostrar os valores hexadecimais de cada caractere que vem do outro lado da porta serial. Então, você poderia pelo menos verificar se o seu código está funcionando corretamente ou não.

Agora, pergunta. Does WriteFile retorno quando ele atinge o NULL, ou será que apenas sentar e esperar, e nunca mais voltar?

Se ele nunca retorna, então ele pode não ser o seu código. WriteFile retorna apenas quando tiver enviado todos dwBytesToWrite, ou se houver um erro. Qualquer outra coisa, e ele está tentando escrever, mas há uma falha na outra extremidade.

Para enviar um personagem NULL através de série que você pode usar a função SetEndOfFile (), dando o manipulador de porta como arquivo.

Se você tem muitos dados NULL para enviar provavelmente não é ideal, mas é uma solução alternativa.

detalhes Função

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