Pergunta

Nós temos um sistema rodando o XP incorporado, com COM2 ser um porto RS485 hardware.

No meu código, estou a criação do DCB com RTS_CONTROL_TOGGLE . Eu supor que faria o que diz ... desligar RTS no modo kernel uma vez que a interrupção vazio gravação acontece. Isso deve ser praticamente instantânea.

Em vez disso, vemos em um escopo que o PC está impulsionando a qualquer lugar de ônibus de 1-8 milissegundos mais do que o fim da mensagem. O dispositivo que está falando está respondendo em cerca de 1-5 milissegundos. Então ... comunicações corrupções abundância. Não, não há nenhuma maneira de mudar o tempo de resposta do alvo.

Temos agora ligado à porta RS232 e conectado o escopo para as linhas TX e RTS, e estamos vendo a mesma coisa. As Line permanece RTS altos 1-8 milissegundos após a mensagem é enviada.

Também tentei desligar o FIFO, ou definir as profundezas FIFO a 1, sem efeito.

Todas as idéias? Estou prestes a tentar manualmente controlar a linha RTS do modo de usuário com prioridade em tempo real durante o "SendFile, RTS claras" ciclo. Eu não tenho muitas esperanças de que isso vai funcionar. Isso não deve ser feito em modo de usuário.

Foi útil?

Solução

RTS_CONTROL_TOGGLE não funciona (tem uma variável de 1-15 milissegundo atraso antes de desligá-lo após transmissão) na nossa plataforma embarcada XP. É possível que eu poderia conseguir isso para baixo se eu alterei o quantum de tempo de 1 ms usando timeBeginPeriod (1), etc, mas eu duvido que seria confiável ou suficiente para importa. (Os responde dispositivo @ 1 milissegundo às vezes)

A solução final é realmente feio, mas funciona neste hardware. Eu não iria utilizá-lo em qualquer coisa onde o hardware não é fixo em pedra.

Basicamente:

1) definir as FIFOs na página gerenciador de dispositivos da porta serial para fora ou 1 caráter profundo

2) enviar sua mensagem + 2 extra bytes usando este código:

int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped)
{
  int iOldClass = GetPriorityClass(GetCurrentProcess());
  int iOldPriority = GetThreadPriority(GetCurrentThread());
  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

  EscapeCommFunction(hPort, SETRTS);

  BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped);

  EscapeCommFunction(hPort, CLRRTS);

  SetPriorityClass(GetCurrentProcess(), iOldClass);
  SetThreadPriority(GetCurrentThread(), iOldPriority);

  return bRet;
}

O WriteFile () retorna quando o último byte ou dois foram escritos à porta serial. Eles não ter saído do porto, no entanto, portanto, a necessidade de enviar 2 bytes extras. Um ou os dois vai ficar na lixeira quando você faz CLRRTS.

Como eu disse ... é feio.

Outras dicas

Todas as idéias?

Você pode achar que não há código fonte para o driver da porta serial no DDK, que iria deixá-lo ver como essa opção é suposto ser implementados:. Ie se está em nível de interrupção, a DPC-nível, ou pior

Outras possibilidades incluem reescrever o condutor; usando um driver de 3-parte RS485 se você pode encontrar um; ou usando hardware RS485 3-parte com seu próprio driver (por exemplo, pelo menos nos últimos 3 partes usados ??para fazer "placas de porta serial inteligentes" com 32 portas, buffers de profundidade, e seu próprio microprocessador; espero que RS485 é um problema que tem sido resolvido por alguém).

8 milissegundos parece ser um decepcionante muito tempo; Eu sei que o XP não é um RTOS mas eu esperaria que ele (normalmente) fazer melhor do que isso. Outra coisa a olhar é se existem outros tópicos de alta prioridade em execução que pode estar interferindo. Se você tiver sido impulsionar as prioridades de alguns tópicos em seu próprio aplicativo, talvez em vez você deve estar reduzindo as prioridades de outros tópicos.

Estou prestes a tentar manualmente controlar a linha RTS do modo de usuário com prioridade em tempo real durante o "SendFile, RTS claros" ciclo.

Não deixe que a rotação fio fora de controle:. IME uma linha como essa podem se buggy antecipar qualquer outro segmento do modo de usuário para sempre

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