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.