Comunicações seriais com processamento

Comunicações seriais com processamento

Comunicações seriais com processamento

A classe serial

As operações para usar comunicações seriais em Tratamento são definidos na classe Serial.A primeira operação a realizar para utilizá-los em um programa (esboço) será incorporá-lo ao código com import processing.serial.*;.

Tabela de conteúdos

    A aula Serial Possui cinco construtores diferentes dependendo dos parâmetros indicados. O único parâmetro obrigatório é o objeto pai (principal) que geralmente corresponde ao programa principal (digamos, a janela do programa) da classe PApplet. Como normalmente o pai será o programa que está sendo escrito (o esboço atual), o valor deste primeiro parâmetro obrigatório será this.

    Os outros cinco parâmetros que podem ser passados ​​ao construtor são ① a velocidade, ② o nome da porta serial ③ o paridade usados ​​no protocolo, ④ os bits de dados e ⑤ os bits de parada. Os parâmetros passados ​​com mais frequência, além do objeto pai necessário, são o nome da porta e a velocidade.

    La velocidade de comunicação serial é um número inteiro (int) que o padrão é o valor 9600 se este parâmetro não for passado para o construtor.

    Portas seriais disponíveis. O método de lista

    El nome da porta tem a forma determinada pelo sistema, desta forma, por exemplo em Distribuições Linux será algo como / dev / ttyS4 / dev / ttyACM3 o / dev / ttyUSB1 (dependendo do tipo de porta), enquanto no Windows será algo como COM12. A menos que uma porta esteja fisicamente associada a um dispositivo, o programa normalmente não saberá qual porta usar. Uma forma comum de selecionar a porta é obter uma lista das disponíveis, mostrá-la ao usuário e permitir que ele escolha aquela que deseja utilizar. O método Serial.list() retorna um vetor de strings de texto (String) com os nomes das portas disponíveis no sistema.

    A porta usada por padrão pela biblioteca Serial é o primeiro daqueles retornados pelo método list (certamente COM1 no Windows ou / dev / ttyS0 en GNU / Linux). Exceto em contextos muito limitados em que o hardware com o qual se trabalha é estritamente conhecido (como um sistema em modo quiosque), normalmente não é omitido e a porta de destino é expressamente indicada.

    Processando serial Linux Lista serial porta ttyACM ttyS ttyUSB

    A captura de tela acima mostra a saída de um sistema GNU / Linux que possui quatro portas seriais RS-232 (ttyS0 a ttyS3) e cinco adaptadores de dois tipos (ttyACM0 a ttyACM1 y ttyUSB0 a ttyUSB2).

    Permissões de dispositivos seriais Linux ttyACM ttyS ttyUSB

    Para acessar as portas seriais o usuário deve pertencer ao grupo ao qual o sistema as atribui, normalmente tty o discar. Na captura de tela da imagem acima você pode ver que as portas seriais listadas com ls /dev/tty[ASU]* -la pertence ao grupo discar que tem permissões de acesso de leitura e gravação neles.

    Parâmetros de protocolo serial

    La paridade de comunicações seriais é expresso em Tratamento como personagem (char) que pode assumir os valores: ① N (Nenhum) para não detectar o paridade, ② E (até) para indicar que bit de paridade é par, ③ O (estranho) para indicar que bit de paridade é estranho, ④ M (marca) para sempre fazer o bit de paridade e ⑤ S (espaço) para sempre fazer um bit de paridade. O valor padrão, se não for passado ao construtor como parâmetro, é N (sem paridade).

    Número bits de dados, que é oito por padrão, indica o número de bits que compõem a carga útil de dados líquidos (chamada de caractere ou às vezes de palavra) que é transmitida em cada unidade básica do quadro. O parâmetro que indica o número de bits de dados é expresso como um número inteiro (int).

    Por fim, o quinto parâmetro possível indica a duração da nota final, expressa como parar bits (parar bits), que é indicado como um número representado em ponto flutuante (float) que pode assumir os valores 1.0 (o valor padrão se o parâmetro não for passado para o construtor), 1.5um 2.0.

    Construtores da classe Serial

    A lista a seguir mostra as diferentes combinações de parâmetros que podem ser passados ​​para o construtor da classe Serial:

    • Serial(padre)
    • Serial(padre,puerto)
    • Serial(padre,velocidad)
    • Serial(padre,puerto,velocidad)
    • Serial(padre,puerto,velocidad,paridad,bits_datos,bits_parada)
    Encerrar as comunicações seriais. O método de parada.

    Para liberar a porta serial, atribuída ao instanciar Serial, e que outros aplicativos do sistema possam usá-lo, as comunicações serão encerradas com o método stop, que não recebe parâmetros.

    Envie dados pela porta serial. O método write

    Para enviar dados, a classe Serial de Tratamento incorpora o método write com o qual você pode transmitir ① strings de texto (String), ② bytes ou ③ vetores de bytes (byte[]). É interessante lembrar que byte en Tratamento (No Java) representa um número inteiro entre -128 e 127 e, por padrão, strings usam a codificação UTF-16.

    Ler dados da porta serial

    Para que o programa possa realizar outras tarefas enquanto os dados são recebidos pela porta serial, é comum armazenar em um amortecer os dados que chegam e lê-los quando apropriado. Embora normalmente não seja muito eficiente, você pode parar o aplicativo para carregar todos os dados disponíveis; Porém, o mais comum será ler a informação à medida que ela chega, seja em cada iteração de draw, quando uma determinada quantidade estiver disponível ou um código especial for recebido.

    Quantidade de dados disponíveis no buffer. O método disponível

    Para saber se os dados chegaram amortecer série, o método available retorna o número de bytes que já foram armazenados neste amortecer. Em ambos os casos, as operações de leitura podem retornar um valor especial (como -1 o null) ao tentar carregar dados de amortecer série quando vazia.

    Carregue um byte de cada vez. O método de leitura

    Os principais métodos da classe Serial que servem para ler as informações recebidas por uma porta serial são aqueles do "tipo read» que se diferenciam entre si, principalmente, pelo tipo de dados em que entregam as informações recebidas.

    read é usado para entregar os bytes recebidos pela porta serial como um valor entre 0 e 255. Conforme o tipo de dados byte de Tratamento representa o intervalo entre -128 e 127 e não entre 0 e 255, é necessário usar um int para representar o intervalo retornado por read. Se você tentar ler com read e pelo amortecer string está vazia, retorna valor -1

    Leia caracteres da porta serial. O método readChar

    O método readChar é similar a read mas retorna um valor no formato char em vez de um int. Como internamente, o char en Tratamento (No Java) são armazenados com dois bytes, valor escolhido para retornar na leitura com readChar um amortecer série vazia é 0xFFFF o -1.

    Carregue uma string de texto. Os métodos readString e readStringUntil.

    O método readString retorna um objeto String formado a partir de todos os dados disponíveis no amortecer série no momento da consulta.

    O método readString cria a string de texto assumindo que os bytes recebidos pela porta serial estão no formato ASCII portanto, este método de leitura não pode ser usado para outras codificações.

    Se for sobre ler o amortecer série com readString quando vazio, o valor de retorno é null.

    O método readStringUntil adicionar à readString a capacidade de retornar informações carregadas no amortecer série dividindo-a por um caractere especial (código) que é passado como parâmetro. Esta forma de ler a informação recebida permite-nos distinguir tanto separadores como terminadores que ajudam a interpretar a informação recebida.

    O método readStringUntil trazer de volta null quando no amortecer series não encontra o código especificado no argumento passado a ela (um byte).

    No código a seguir para Arduino envia três mensagens pela porta serial. Os dois primeiros terminam em uma aba, então aparecerão no console. Tratamento, enquanto o terceiro, embora seja enviado pela porta serial, não será lido com readStringUntil(9) já que não termina em uma aba (com código ASCII

    Processando Serial.readStringUntil ler string serial

    Leia blocos de dados. Os métodos readBytes e readBytesUntil.

    Os métodos vistos acima são utilizados para leitura de dados com formatos específicos, para leitura de blocos de dados brutos ou com formato não previsto em Tratamento métodos são usados readBytes y readBytesUntil

    O método readBytes tente ler os dados disponíveis no amortecer Series. Se nenhum parâmetro for passado para o método readBytes todos os dados disponíveis são lidos e retornados em um vetor (byte[]). Se um número inteiro for passado como parâmetro, um máximo do número de bytes indicados por este número é lido e também retornado como um vetor.

    Existe uma terceira maneira de usar readBytes, mais eficiente, que toma como argumento um vetor de bytes no qual o conteúdo do amortecer Series. Essa forma de usar readBytes retorna um número inteiro (int) que representa o número de bytes que foram lidos.

    O método readBytesUntil funciona de forma semelhante, mas inclui um primeiro parâmetro que representa o valor do byte que, se encontrado no amortecer, indicará o final da leitura. Neste método, o parâmetro que determina o número máximo de bytes que serão lidos não faz sentido, pois a quantidade será determinada pelo código especial.

    Para testar o funcionamento do método readBytes Vamos supor o seguinte código para Arduino que envia um texto pela porta serial.

    O programa de exemplo a seguir para Tratamento lê texto da porta serial em blocos de 32 bytes (TOTAL_BYTES). Para verificar se funciona, ele mostra através do console como caracteres, forçando o tipo dos bytes recebidos a char.

    Na captura de tela a seguir você pode ver como eles são exibidos no console Tratamento os dados que foram carregados em blocos de (máximo) 32 bytes (TOTAL_BYTES) cada vez. Mas há um problema que já foi falado: Arduino tem enviado os versos de Federico Garcia Lorca do exemplo codificado como texto no formato UTF-8, que não é o usado Tratamento (Java), o que você prefere UTF-16 então aqueles que não correspondem à classificação do ASCII imprimíveis são interpretados incorretamente.

    Processando Serial.readBytes UTF-16

    Para resolver este problema, os conjuntos de caracteres podem ser carregados (conjunto de caracteres) e defina um novo objeto String forçando-o a ser representado com codificação UTF-8 conforme mostrado no código de exemplo a seguir.

    Processando Serial.readBytes UTF-8

    Leia os últimos dados recebidos. Os métodos last e lastChar.

    Enquanto o resto dos métodos de leitura (o "tipo read») eles carregam as informações do amortecer série na mesma ordem em que chegou (FIFO), com esses dois métodos o último byte que atingiu o amortecer Series. O método last retorna o valor do último byte como um int y lastChar retorna o valor como um char.

    Gerenciamento de buffer serial

    Embora os métodos vistos até agora sejam perfeitamente funcionais, nem sempre representam a melhor forma de explorar o acesso à porta serial. Para carregar os dados, eles precisam verificar periodicamente o status do amortecer série e leia os dados disponíveis em uma parte repetida do código. Uma maneira geralmente mais eficiente é ler os dados somente quando você sabe que eles estão disponíveis.

    Leia a porta serial quando os dados são recebidos. O evento em série.

    Para acessar o amortecer serial quando os dados são recebidos, o evento Serial pode ser explorado gerenciando-o através da definição do método serialEvent. Este método usa a porta serial que o inicia como argumento.

    Dimensione o buffer serial. O método buffer.

    Se você souber o número de bytes que compõem um bloco de dados úteis, poderá otimizar ainda mais esse estilo de leitura dos dados. amortecer série através serialEvent. O método buffer permite definir o número de bytes que serão armazenados no amortecer antes de lançar um evento serial. O método espera como parâmetro um número inteiro que represente a quantidade de bytes.

    Preencha o buffer até que um valor seja recebido. O método bufferUntil.

    Em vez de definir a chamada do método serialEvent para uma quantidade de dados no amortecer, com o método bufferUntil você pode configurar para armazenar dados até que um valor especial chegue e então gerar o evento Serial. O parâmetro passado para este método é um int que representa o valor produzido pela chamada para serialEvent.

    Exclua os dados armazenados no buffer. O método claro.

    Com o método clear Você pode excluir os dados que estão atualmente no amortecer. Este método pode ser utilizado, por exemplo, para iniciar uma nova sessão de recepção de dados ignorando os dados restantes da anterior.

    Aplicação típica de processamento para leitura de dados através da porta serial

    Finalmente, é conveniente recapitular as operações do objeto Serial de Tratamento que são mais comumente utilizados, passando por um exemplo típico de recebimento de dados pela porta serial para desenhar um gráfico com eles, neste caso de áreas empilhadas.

    Importe a biblioteca serial

    Determinar protocolo de dados (separadores)

    Determine o objeto da classe Serial

    Instancie o objeto da classe Serial definindo a porta serial usada

    Configurar o buffer da porta serial

    Implemente um manipulador para o evento Serial

    Ler buffer serial

    Condicione os dados recebidos

    Terminar comunicações seriais

    O código de exemplo abaixo ilustra esse resumo com uma aplicação funcional (embora muito simples) que gera um gráfico de área com os valores que são recebidos pela porta serial, algo semelhante ao que mostra a animação a seguir.

    gráfico com Processamento com dados recebidos pela porta serial

    Para não se perder no resto do programa e focar a atenção nas comunicações seriais com Tratamento, as linhas de código que correspondem às operações anteriores são destacadas.

    Postar Comentário

    Você pode ter perdido