linux rs232

0

Eu tenho que fazer um código em C para detectar o tempo inter-caracteres dentro de uma linha rs232 no linux. O tempo entre os caracteres para detectar pode ser de 1 ms. Então eu preciso de algo para marcar timestamp muito rapidamente um incomming caracteres. Quando digo muito rapidamente é menos que 1ms. O objetivo é detectar o final de um quadro e o início de um novo quadro na linha.

Eu não peço uma solução de codificação, eu só quero uma ajuda inicial para saber o caminho que eu tenho que fazer: é possível fazer isso no linux? Eu tenho que modificar um driver para chegar a esse tipo de tempo? Ou algo no espaço do usuário pode fazer isso (eu acho que não).

    
por romaric crailox 26.09.2017 / 15:57

2 respostas

1

É um UART on-board ou um dongle USB? Para o primeiro, eu modificaria a rotina de interrupção do driver serial para armazenar os dados em conjunto com um registro de data e hora, entregaria os dados com o registro de data e hora para o espaço do usuário e deixaria o espaço do usuário resolvê-lo. Enquanto o Linux não é em tempo real, eu esperaria que ele fosse capaz de responder a todas as interrupções em menos de 1 ms, então isso seria o suficiente.

Para um dongle USB, usbmon já fornece carimbos de data e hora em microssegundos, então acho que devo usar usbmon junto com o driver USB serial normal e modificar o driver USB serial para tornar esses carimbos de tempo acessíveis.

    
por 26.09.2017 / 19:07
1

I have to do a code in C to detect the inter-characters time within a rs232 line on linux ...

Você postou um problema XY .

I want to do that because a silent of more than 1ms means end of a frame and beginning of a new frame.

(BTW em comunicação serial assíncrona como RS-232, uso não qualificado de "frame" é ambíguo, já que cada caractere é enquadrado. EG quando uma UART relata um 'erro de enquadramento', um caractere foi (possivelmente) perdido. Presumivelmente você realmente significa pacote ou unidade de mensagem.)

Seu comentário adicional finalmente revela a questão X real que precisa ser resolvida.
Como o problema atual é detectar lacunas entre mensagens, sua pergunta original sobre Y não é apenas difícil de implementar com precisão no software, mas também não é uma solução viável para o problema do X.

Qualquer solução envolvendo a "medição" do intervalo de tempo entre os caracteres recebidos pelo software para detectar uma lacuna entre mensagens é uma solução falha. Essa abordagem falha no caso degenerado:
quando o último caractere de uma mensagem chegar e se não houver mais chars (por enquanto), então a última mensagem recebida será interrompida indefinidamente enquanto o algoritmo aguarda o próximo caractere (o primeiro byte da mensagem). próxima mensagem) para que a diferença de tempo possa ser calculada.
Contanto que o "próximo caractere" não seja 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 apropriada é usar hardware que possa medir quando um caractere foi ou não foi recebido. Alguns USARTs da Atmel têm um recurso Tempo limite do receptor 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 redefinir a contagem de intervalos conforme cada caractere é recebido. Quando a contagem excede um limite (ou seja, count * interval_time > inter_message_gap_time), o receptor ficou em silêncio por muito tempo, indicando um intervalo entre mensagens.

    
por 26.09.2017 / 22:56

Tags