Ir para o conteúdo

Comunicação Can Bus

A comunicação Can Bus está disponível por meio de um acessório adicional que é conectado a uma porta serial UART.

Configurações de hardware

O acessório conversor de UART para Can Bus deve ser conectado ao Display Android em uma das portas seriais UART em modo TTL.

Acessório conversor de UART para Can Bus

O conversor pode ser configurado alterando a posição das chaves DIP, segundo as tabelas a seguir:

Chave 1 Tipo de frame
OFF Standard (ID de 11 bits)
ON Extended (ID de 29 bits)
Chave 2 Chave 3 Baud rate
OFF OFF 500kHz
ON OFF 1000kHz
OFF ON 250kHz
ON ON 100kHz
Chave 4 Função
OFF Proibido
ON Obrigatório

A conexao dos pinos deve ser feita de acordo com a tabela a seguir:

Pino do conversor Pino do Display
+5V V
RXD T
TXD R
GND G

ATENÇÃO

A porta UART do Display Android deve estar em modo TTL. Conectar o conversor em modo RS232 poderá causar danos irreparáveis.

Configuração do projeto

A comunicação com o acessório conversor é feita via serial UART. Para simplificar a implimentação, nós disponibilizamos uma biblioteca de código em Java que abstrai a comunicação UART, sendo necessário apenas configurar qual porta serial será usada e qual o tipo de frame (29-bits ou 11-bits) do protocolo Can Bus.

Dica

Baixe o projeto de demonstração de Can Bus na página de exemplos para ter um ponto de partida rápido!

Exemplos de código

Configuração e instanciação do Can Bus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends AppCompatActivity {
    // ...

    private Canbus canBus;

    // ...

    @Override
    public void onCreate(Bundle savedInstanceState) {

        // ...

        /* Configuração de porta UART e tipo de frame do Can Bus */
        String serialPort = SerialEnums.Ports.ttyS1;
        CanbusMessageType canbusMessageType = CanbusMessageType.ExtendedMessage_29BitId;

        canBus = new Canbus(serialPort, canbusMessageType);

        /* Configuração do ouvinte de recepção das mensagens Can Bus */
        canBus.RegisterMessageListener(new ICanBusReceiver() {
            @Override
            public void onMessageReceived(CanbusMessage canbusMessage) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String messageId = "" + canbusMessage.getMessageId();
                        byte[] messageData = canbusMessage.getMessageData();

                        String messageDataAsString = TransformUtils.bytes2HexString(messageData, messageData.length);

                        textViewReceived.setText("CanBus: ID=" + messageId + ", DATA=" + messageDataAsString);
                    }
                });
            }
        });

        // ...
    }    

    // ...
}

Métodos para enviar mensagens (em algum método da classe MainActivity do exemplo acima):

1
2
3
4
5
6
7
8
    // ID da mensagem. Deve ser único no barramento. Números menores têm prioridade maior.
    int sampleMessageId = 254;

    // Até 8 bytes de dados por mensagem.
    byte[] sampleMessageData = 
    new byte[]{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x11};

    canBus.sendMessage(sampleMessageId, sampleMessageData);

Abertura e fechamento da porta de comunicação (na classe MainActivity do exemplo acima):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
    // ...

    @Override
    protected void onResume() {
        super.onResume();

        /* Start CanBus listening on selected port */
        canBus.Start();
    }

    @Override
    protected void onPause() {
        super.onPause();

        /* Stop CanBus listening and releases the serial port */
        canBus.Stop();
    }

    // ...