por xultz » 23 Out 2007 18:06
É bastante simples. No teu caso, o ideal é usar a boa e velha técnica do mestre e escravos. Funciona assim:
um dos membros do barramento você considera o mestre. No teu caso, o mais óbvio seria deixar o PC como mestre. Todos os demais são escravos.
Somente o mestre começa uma transmissão. Um escravo somente transmite se o mestre mandar, caso contrário ele vai ficar quieto, mesmo que esteja com vontade de ir no banheiro. Somente se o mestre perguntar a ele se ele quer ir no banheiro, ele vai poder responder que sim, caso contrário, ele vai ficar apertado esperando.
A segunda coisa a fazer é determinar um endereço para cada dispositivo, inclusive o mestre. Você, por exemplo, determinar que o PC é 01, o PIC é 02, e os demais dispositivos vão recebendo endereços. Nas placas, por exemplo, você pode setar um valor colocando pinos em nível alto e baixo (se tiver), e a placa quando é ligada lê estes bits e assume como seu endereço. É imprescindível que você não atribua dois dispositivos com o mesmo endereço.
Daí você precisa criar um protocolo. Uma maneira simples seria um protocolo onde cada mensagem (ou frame) é feito de 5 bytes. O primeiro byte é um valor especial que sinaliza início de frame. Escolha qualquer um entre 0x00 e 0xFF. Suponha que você escolheu o valor 0xC5.
O segundo é o destinatário do frame. O terceiro e quarto byte são informações (mais a respeito abaixo), e o último é o checksum. Um jeito simples de fazer o checksum é somar todos os bytes, do primeiro ao quarto.
A rotina dos escravos de recepção é um fluxograma simples:
você tem um flag de start byte, e um de endereço. E duas variáveis de informação.
Começa a rotina com os dois flags zerados.
Se ambos flags estiverem zerados e recebeu um start byte, sobe o flag de start byte.
Se o flag de start estiver alto e recebeu um byte que é igual ao seu endereço, sobe o flag de endereço.
Se ambos flags estão altos e recebeu um byte, é o primeiro byte de informação. O próximo é o segundo byte.
Se recebeu os dois bytes, os dois flags estão altos, o próximo é o checksum. Calcula o checksum somando o start byte, o endereço e os dois bytes recebidos, se conferir, então frame é válido.
Se qualquer uma das situações acima não baterem, zera tudo porque é lixo.
Na resposta, o escravo manda as informações com o mesmo protocolo, mandando para o endereço 01. Desse jeito, ninguém interfere na comunicação de ninguém, e o software fica perguntando e comandando quem ele quiser na hora que quiser. Se ele enviar uma pergunta e não obtiver uma resposta, algo de errado ocorreu e o usuário recebe um aviso, pode ser que um dos dispositivos pifou, pode ser que a rede inteira está fora do ar (você sabe isso se somente um dispositivo não responde, ou se ninguém responde).
Pois bem, assim definimos algumas camadas OSI da tua rede (é bem interessante você ler sobre isso).
Na parte dos dois bytes de informação, você fica livre para implementar o que é mais adequado, mas vou dar umas sugestões.
Por exemplo, suponha que cada placa tem 4 relés. Você pode criar uma tabela em que o primeio byte é um comando e o segundo é um parâmetro. Por exemplo, o comando 01 pode ser o comando de ligar relé, o comando 02 para desligar, e o parãmetro é o relé a ser comandado. Para este comando a placa pode retornar o mesmo valor do comando no primeiro byte e 0x01 para comando executado com sucesso e 02 para não executado (por exemplo, por algum motivo o PC mandou ele comandar um relé que ele não tenha).
Suponha que as placa possuem um sensor de temperatura, de 16 bits. O PC mandando no primeiro byte o comando 0x81 para solicitar o valor do sensor, e no segundo 0x00 (que não serve para nada), e a placa responde no primeiro e segundo byte os valores do sensor de temperatura.
E por fim, você pode criar um comando de Hello, que a placa responde se ela estiver no barramento. Se o PC não receber resposta após um certo tempo (1 segundo, por exemplo), ele sabe que a placa não eá no barramento, ou tem algum problema. Dessa forma, você pode até fazer o software varrer o barramento para ver quem está presente. Na resposta do Hello, no primeiro byte por exemplo a placa pode responder com um byte que representa que tipo de placa ela é.
Conseguiu pescar a idéia? É um protocolo simples, mas funciona legal, eu fiz um semelhante, só que os frames tinham tamanho variável, com até 250 bytes de parâmetro, daí o byte logo em seguida do endereço dizia quantos bytes seriam transmitidos, mas a rotina de tratamento era basicamente o que eu mostrei acima, e está funcionando bem até hoje.
Espero ter ajudado...
98% das vezes estou certo, e não estou nem aí pros outros 3%.