
Tenho que fazer um código em C para detectar o tempo entre caracteres dentro de uma linha rs232 no linux. O tempo de detecção entre caracteres pode ser de 1 ms. Então, preciso de algo para registrar a data e hora muito rapidamente dos caracteres recebidos. Quando digo muito rápido é menos de 1ms. O objetivo é detectar o final de um quadro e o início de um novo quadro na linha.
Não peço uma solução de codificação, só quero uma ajuda inicial para saber que caminho devo seguir: é possível fazer isso no linux? Tenho que modificar um driver para atingir esse tipo de tempo? Ou algo no espaço do usuário pode fazer isso (acho que não).
Responder1
Isso é um UART integrado ou um dongle USB? Para o primeiro, eu modificaria a rotina de interrupção do driver serial para armazenar os dados junto com um carimbo de data/hora, entregar os dados com o carimbo de data/hora para o espaço do usuário e deixar o espaço do usuário resolver isso. Embora o Linux não seja em tempo real, espero que ele seja capaz de responder a todas as interrupções em menos de 1 ms, então isso deve ser suficiente.
Para um dongle USB, usbmon
já fornece carimbos de data/hora em microssegundos, então acho que devo poder usar usbmon
junto com o driver USB serial normal e modificar o driver USB serial para tornar esses carimbos de data/hora acessíveis.
Responder2
Tenho que fazer um código em C para detectar o tempo entre caracteres dentro de uma linha rs232 no linux...
Você postou umProblema XY.
Quero fazer isso porque um silêncio de mais de 1 ms significa o fim de um quadro e o início de um novo quadro.
(Aliás, em comunicações seriais assíncronas, como RS-232, uso não qualificado de"quadro"é ambíguo, já que cada personagem é enquadrado. Por exemplo, quando um UART relata um 'erro de enquadramento', um caractere foi (possivelmente) perdido. Presumivelmente, você realmente quer dizer pacote ou unidade de mensagem.)
Seu comentário adicional finalmente revela o problema real do X que precisa ser resolvido.
Como o problema real é detectar lacunas entre mensagens, sua pergunta original sobre Y não é apenas difícil de implementar com precisão em software, mas nem sequer é uma solução viável para o problema X.
Qualquer solução que envolva a "medição" do intervalo de tempo entre caracteres recebidos por software para detectar uma lacuna entre mensagens é uma solução falha. Esta abordagem falha no caso degenerado:
quando o último caractere de uma mensagem chega e se não houver mais caracteres (por um tempo), então a última mensagem recebida éparadoindefinidamente enquanto o algoritmo espera pelo próximo caractere (o primeiro byte da próxima mensagem) para que a diferença de tempo possa ser calculada.
Enquanto o "próximo caractere" não for recebido, o "fim da mensagem" não será determinado e a última mensagem válida será concluída, mas não processada.
A solução adequada é usar hardware que possa medir quando um caractere foi, ou melhor, não foi recebido. Alguns USARTs da Atmel têm umTempo limite do receptorrecurso para detectar a lacuna entre mensagens.
Uma possível solução de software exigiria um temporizador periódico (de alta resolução) que o driver U(S)ART usaria para contar os intervalos de tempo entre os caracteres recebidos. Usando PIO em vez de DMA, o driver teria que zerar a contagem de intervalos conforme cada caractere fosse recebido. Quando a contagem excede um limite (isto é, contagem * interval_time > inter_message_gap_time), então o receptor ficou em silêncio por muito tempo, indicando um intervalo entre mensagens.