Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Comunicação Via Porta Serial


Guest José Da Silva

Pergunta

Guest José Da Silva

Este post foi desmembrado do tópico: Uma Duvida...

________________________

Caros amigos do Fórum,

Existe algum componente que permita ligar a porta Serial do PC de forma a comunicar com este Interface (isto do lado do Servidor)? E já agora como eu faço para pegar o protocolo da interface? Por exemplo de comunicação é o seguinte:

<AAh><55h><IL><source><destination>

onde AAh e 55h são dois bytes de inicio da trama para sincronização de dados;

<IL> é um byte composto de código de instruções I(4 bits +significativo) e nivel operativo L (2 bits menos significativos)

Os 2 niveis operativos são normalmente assim atribuídos:

Level0 (bit 0) ----- vídeo composto/_YC/Component/SDI

Level1 (bit 1) ----- áudio

<source> representa o nº de canal de entrada (de 0 a 7 da Matriz)

<destination> representa o nº de canal de saída (de 0 a 7 desta Matriz)

Preciso de saber como manipular estes dados da parte do servidor....

Editado por Micheus
Tópico desmembrado de outro
Link para o comentário
Compartilhar em outros sites

22 respostass a esta questão

Posts Recomendados

  • 0
Existe algum componente que permita ligar a porta Serial do PC de forma a comunicar com este Interface (isto do lado do Servidor)?
Ter tem - só não tenho como lhe citar qual seja agora. (talvez alguém possa adiantar isto)

E já agora como eu faço para pegar o protocolo da interface?

Por exemplo de comunicação é o seguinte:

<AAh><55h><IL><source><destination>

onde AAh e 55h são dois bytes de inicio da trama para sincronização de dados;

<IL> é um byte composto de código de instruções I(4 bits +significativo) e nivel operativo L (2 bits menos significativos)

Os 2 niveis operativos são normalmente assim atribuídos:

Level0 (bit 0) ----- vídeo composto/_YC/Component/SDI

Level1 (bit 1) ----- áudio

<source> representa o nº de canal de entrada (de 0 a 7 da Matriz)

<destination> representa o nº de canal de saída (de 0 a 7 desta Matriz)

Preciso de saber como manipular estes dados da parte do servidor....

este: "pegar o protocolo da inteface", eu não entendi. O protocolo para comunicação com sua interface dever ser fornecida pelo fabricante. Não está listado em algum manual?

Quando você coloca o exemplo, já está mostrando parte do protocolo de comunicação. Então, você quer saber é como enviá-lo para a porta serial?

Supondo o uso de um componente "X", após aberta a conexão com a porta serial (COM1, COM2, COM3,...), os bytes são enviados após formatados na seqüência definida pelo protocolo.

No caso do <IL>, o byte teria que ser montado conforme dito:

a- as instruções vão nos 4 bits+significativo;

b- os níveis operativos vão nos outro 4 bits - completando 8bits = 1 byte

para simplificar, vamos pensar em hexadecimal. Por exemplo: $FB (decimal -> 251), onde o F (decimal -> 15) está corresponde aos 4 bits mais significativo do byte e o B os 4 bits menos significativos.

Deste modo, para o item "a" os 4 bits representarão valores que irão de 0 a 15 ($0..$F), já para o item "b" você vai ter apenas quatro valores possíveis, conforme combinação dos dois bits:

bits

3 2 1 0 |Dec|Hex

-------- |---|---

0 0 0 0 | 0 | $0

0 0 0 1 | 1 | $1

0 0 1 0 | 2 | $2

0 0 1 1 | 3 | $3

Então, um comando de valor $F (todos os 4 bits ligados) e um nível operativo $2 (o 2º bit menos significativo ligado) combinados em uma variável ficaria deste modo:

ex.: variavel_byte := $F0 +$02;

Link para o comentário
Compartilhar em outros sites

  • 0
Existe algum componente que permita ligar a porta Serial do PC de forma a comunicar com este Interface (isto do lado do Servidor)?

Ter tem - só não tenho como lhe citar qual seja agora. (talvez alguém possa adiantar isto)

Leitura e escrita na Porta serial

Componente VaComm do pacote Async32

http://www.veloso.kit.net/rs232.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Boa Noite a todos os participantes do Fórum,

A minha aplicação já consegue comunicar com a Matriz 8x8. A questão agora é mais bicuda: Como fazer com que os clientes (8 na totalidade), consigam comutar e de forma a não escolherem os mesmos pontos? Uma vez que a Matriz tem apenas uma entrada RS232, que ira estar ligado ao suposto Server, como fazer com que os outros clientes consigam aceder a Matriz? Imaginei que criando uma aplicação do lado do servidor, pudesse através de instruções dos clientes, seleccionar os pedidos. Desta forma, para além de conseguir que os pedidos não se repitam, funcionaria como um "midleware" entre os clientes e a matriz.... mas como fazer isso???!! Será uma ideia viável ou exequível?

Ideias precisam-se!

Uma abraço a todos e um em especial ao amigão Micheus...

José

África

Ah, apenas informar que a Matriz responde com uma comando ack. Isto significa que sempre posso verificar que selecção existe ante de tornar possível a escolha...

Aquele Abraço

José

Link para o comentário
Compartilhar em outros sites

  • 0
Agora surge me uma dúvida: imaginemos que eu quero enviar um comando para a Matrix que seria:

<Aah><55h><D0h>

Como o faria em Delphi?

Um exemplo seria bem vindo....

José, apenas para não lhe deixar sem uma resposta básica (já que estou sem tempo para implementações maiores), vou explorar o exemplo existente no link que o colega Jhonas postou anteriormente: http://www.veloso.kit.net/rs232.html

Se você tentar seguir as orientações dele lá, acho que você verá que para a sequencia que você colocou bastaria enviar desta forma?

procedure TForm1.BtnSendClick(Sender :TObject);
var
  Buffer :array[0..255]of char;
begin
  FillChar(Buffer, 0, sizeof(Buffer));  // acho que é esta a sequencia
  Buffer[0] := $AA;  // <Aah>
  Buffer[1] := $55;  // <55h>
  Buffer[2] := $D0;  // <D0h>
  VaComm1.WriteText(Buffer);  // se necessário, utilize type-cast para string -> VaComm1.WriteText(String(Buffer));
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite a todos,

Micheus, acho que aqui falta alguma coisa....

Qualquer coisa deste género faria mais sentido:

procedure TForm1.SpeedEnviaClick(Sender: TObject);

begin

ComPort1.send( MemoTX.Text + #13#10 ); //Envia a string de comandos mais CR/LF.

Form1.MemoTX.Clear();

end;

end.

Mas ainda estou a toa...tenho de enviar em Hexa, porque senão o interface não reconhece..

Abraço a tocdos e fico aguardando ideias frescas...

Africa

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, acho que aqui falta alguma coisa....

Qualquer coisa deste género faria mais sentido:

procedure TForm1.SpeedEnviaClick(Sender: TObject);
begin
  ComPort1.send( MemoTX.Text + #13#10 ); //Envia a string de comandos mais CR/LF.
  Form1.MemoTX.Clear();
end;

end.
Mas ainda estou a toa...tenho de enviar em Hexa, porque senão o interface não reconhece..
José, por acaso há algum tipo de documentação sobre como as informações devem ser enviadas para sua matriz. Algo como um manual em PDF, para que possa ajudar melhor. Veja bem, o que faz sentido é que se envie o que o hardware espere receber: sequência de inicialização, texto, parâmetros, o que for. Só com uma documentação dá para explorar melhor. A questão de enviar em Hexa decimal é apenas um detalhe. Se você leu lá em cima quando falei algo sobre ele, você deve ter observado que é apenas uma forma de representação do valor de um byte (8 bits): Hexa-decimal ($00 a $FF), Decimal (0 a 255), Binário (00000000 a 11111111) e até poderíamos citar Caracter (#0 a #255) Assim, mesmo o exemplo que postei acima (em hexa) poderia ser aplicado com caracteres:
...
  Buffer[0] := 'ª';  // <Aah> - $AA, 170, 10101010
  Buffer[1] := 'U';  // <55h> - $55, 85, 01010101
  Buffer[2] := 'Ð';  // <D0h> - $D0, 208, 11010000

então, se você tiver que concatenar texto à seqüência a ser enviada, não há qualquer problema - concatene o string. O detalhe pode ser apenas a forma como seu hardware espera receber esta seqüência: se deve ser informado o tamanho da sequencia sendo enviada ou se ele utiliza o zero (#0) como terminador.

Como disse, mais informação sobre como seu hardware seria bem vinda.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite companheiros,

Tenho aqui alguns exemplos:

EXAMPLE

Command example : 5 byte

Header + command + source + destination

Header : AAH 55H

Command : 01 ( video) / 02 ( audio) / 03 (audio/ video) / FFH ( Blank)

Source : 01-08 Input selection

Destination : 01-08 Output selection

Exemplo de instrução:

51(Video) 52(Audio) - Retorno de numero de source para o canal de destino

Com este comando é possível interrogar a matriz para obter o numero do "source" que no momento esta no canal destino. O pacote é o seguinte:

<AAh> <55h> <5L> <00> <destination>

A matriz respondera com:

<AAh> <55h> <5L> <source> <destination>

Se depois do comando a matriz responde atribuindo um numero de "source" FFh significa que o seu destino é presentemente uma situação de "blank".

Espero que com este exemplo tenha aclarado a situação. Em todo o caso eu continuo a querer saber como enviar. Neste momento - graças a alguns componentes como o ComPort - já consigo estabelecer comunicação com a Matriz. O que esta ainda dando luta é exactamente como enviar este comando...

Uma abraço a todos e. em especial ao Micheus...

José

Link para o comentário
Compartilhar em outros sites

  • 0
(...) E já agora como eu faço para pegar o protocolo da interface? Por exemplo de comunicação é o seguinte:

<AAh><55h><IL><source><destination>

onde AAh e 55h são dois bytes de inicio da trama para sincronização de dados;

<IL> é um byte composto de código de instruções I(4 bits +significativo) e nivel operativo L (2 bits menos significativos)

Os 2 niveis operativos são normalmente assim atribuídos:

Level0 (bit 0) ----- vídeo composto/_YC/Component/SDI

Level1 (bit 1) ----- áudio

<source> representa o nº de canal de entrada (de 0 a 7 da Matriz)

<destination> representa o nº de canal de saída (de 0 a 7 desta Matriz)

José, neste post inicial vemos que o item <IL> na sua sequência é do tamanho de 01 BYTE, mas fiquei confuso lendo...

Tenho aqui alguns exemplos:

EXAMPLE

Command example : 5 byte

Header + command + source + destination

Header : AAH 55H

Command : 01 ( video) / 02 ( audio) / 03 (audio/ video) / FFH ( Blank)

Source : 01-08 Input selection

Destination : 01-08 Output selection

Exemplo de instrução:

51(Video) 52(Audio) - Retorno de numero de source para o canal de destino

Com este comando é possível interrogar a matriz para obter o numero do "source" que no momento esta no canal destino. O pacote é o seguinte:

<AAh> <55h> <5L> <00> <destination>

A matriz respondera com:

<AAh> <55h> <5L> <source> <destination>

Se depois do comando a matriz responde atribuindo um numero de "source" FFh significa que o seu destino é presentemente uma situação de "blank".

...neste último exemplo aparece um <5L>. Bom, não dá para entender a função do "L" já que não faz parte do "alfabeto" hexadecimal.

Bom, no caso do 1º exemplo citado, será que algo como o código abaixo ajuda. É um exemplo que usa a seleção realizada através de alguns RadioGroup colocados em um form:

procedure TForm1.BtnSendCommand(Sender :TObject);
var
  Header,
  Command,
  Source,
  Destination :string;
begin
  Header :=  Char($AA) +Char($55);
  case RadioGroupCommand.Index of
    0 : Command := Char($01); // Vídeo
    1 : Command := Char($02); // Áudio
    2 : Command := Char($03); // Áudio/Vídeo
    3 : Command := Char($FF); // Blank
  end;
  Source := Char(RadioGroupSource.Index); // 01-08   Input   selection
  Destination := Char(RadioGroupDestination.Index); // 01-08    Output selection
  ComPort1.Send(Header +Command +Source +Destination); //Envia a string de comandos
end;

Espero que com este exemplo tenha aclarado a situação.
ainda acho que ficaria mais fácil se soubesse de que equipamento estamos falando, assim quem sabe seria possível encontrar uma instrução como a deste equipamento (projetor de vídeo) com interface serial: http://www.cineversum.com/projection_syste...ads/pc_cmds.pdf

 
READ_MEAS 48H

Purpose : questions ACTAS Control Unit measurement values.

Cmd
Dat1
Dat2
Dat3
Dat4

48H
Which
Color
Type
Option

Dat4 Option

00H last measured values are returned (immediate answer; 7 byte record)

10H a new measurement is done first; with normal sensitivity (answer is ACTAS’

initiative; full format 9 byte record starting with STX OFFS FEH,…)

11H a new measurement is done first; with sensitivity/10 (answer as for 10H)

Dat3 Type

00H default

01H signed long integer (MSB returned in Dat1, .., LSB in Dat4)

02H IEEE 754 floating point (Dat1 Dat2 Dat3 Dat4 return MMMMMMMM MMMMMMMM EMMMMMMM SEEEEEEE)

Dat1 Dat2 Dat3 function default type

00H 00H 00H reserved

01H 00H 00..02H full_lux IEEE 754 float

02H 00H 00..02H peak_lux IEEE 754 float

03H 00H..02H 00H lux[Dat2] IEEE 754 float [R, G, B]

10H 00H..02H 00H colval[Dat2] meas. in counts, long int; [R, G, B]

11H 00H..02H 00H colref[Dat2] reference in counts, long int; [R, G, B]

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Trata-se de uma Matriz de vídeo e áudio. Com ela é possível seleccionar ate 8 fontes de vídeo/áudio e direcciona-las para outras 8 saidas. Assim, posso seleccionar que o input 1 tem o output em 7, ou seja, source 1 tera a imagem no destination 7, por exemplo... e assim por diante.

Vou analisar a tua dica e, desde já agradeço a tua colaboração... valeu!

Abraço

Ah, ainda sobre o "L". Com esta instrução, se o nível L corresponder ao nível do modulo onde se pretende que haja a comutação, obtém-se o "point crossing on", <source> sobre <destination>.

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

José, no caminho para casa esta manhã, refletindo sobre o exemplo que postei, observei que deixei de fora a forma como você deve concatenar o comando a ser enviado. Eu exemplifiquei apenas o envio do nível operativo, que são enviados nos 2 bits menos significativos. Porém, o comando vai nos 4 bits mais significativos.

Como o comando vai em 4 bits, sabemos que podemos representar apenas valores entre $0 e $F, ou seja 0 a 15. O fato de serem posicionados nos 4 bits mais significativos do BYTE, significa que se partirmos destes valores (0 a 15), teremos que deslocá-los 4 bits à esquerda e agregá-los aos 4 bits menos significativos do nível operativo. Fazemos isto utilizando o operador de bit SHL (Shift Left - deslocamento à esquerda) seguido de uma operação binária OR (OU):

procedure TForm1.BtnSendCommand(Sender :TObject);
var
  Header,
  Command,
  Source,
  Destination :string;
  CmdByte :Byte;
begin
  Header :=  Char($AA) +Char($55);
 // define o nível operativo - observe que apenas os 4 bits menos significativos tem valor
  case RadioGroupLevel.ItemIndex of
    0 : CmdByte := $01; // Vídeo
    1 : CmdByte := $02; // Áudio
    2 : CmdByte := $03; // Áudio/Vídeo
    3 : CmdByte := $FF; // Blank
  end;
 // agrega o comando, nos 4 bits mais significativos
  case RadioGroupCommand.ItemIndex of
    0 : CmdByte := ($00 SHL 4) or CmdByte;
    1 : CmdByte := ($01 SHL 4) or CmdByte;
    2 : CmdByte := ($02 SHL 4) or CmdByte;
    3 : CmdByte := ($03 SHL 4) or CmdByte;
    4 : CmdByte := ($04 SHL 4) or CmdByte;
    5 : CmdByte := ($05 SHL 4) or CmdByte;
    6 : CmdByte := ($06 SHL 4) or CmdByte;
    7 : CmdByte := ($07 SHL 4) or CmdByte;
    8 : CmdByte := ($08 SHL 4) or CmdByte;
    9 : CmdByte := ($09 SHL 4) or CmdByte;
    10 : CmdByte := ($0A SHL 4) or CmdByte;
    11 : CmdByte := ($0B SHL 4) or CmdByte;
    12 : CmdByte := ($0C SHL 4) or CmdByte;
    13 : CmdByte := ($0D SHL 4) or CmdByte;
    14 : CmdByte := ($0E SHL 4) or CmdByte;
    15 : CmdByte := ($0F SHL 4) or CmdByte;
  end;
  Command := Char(CmdByte);
  Source := Char(RadioGroupSource.ItemIndex +1); // 01-08   Input   selection
  Destination := Char(RadioGroupDestination.ItemIndex +1); // 01-08    Output selection
  ComPort1.Send(Header +Command +Source +Destination); //Envia a string de comandos
end;

Também corrigi o Source e Destination, somando um ao ItemIndex, já que este começa em 0 e as entradas/saídas em 1.

OBS: O anexo foi corrigido e se faz necessário adicionar o componente pois eu não o possuo.

Abraços

SendCom.zip

Link para o comentário
Compartilhar em outros sites

  • 0

Ola Micheus,

já tinha antes tentado este comando (ComPort1.send(Header +Command +Source +Destination); //Envia a string de comandos), mas infelizmente da o seguinte erro:

[Error] Unit1.pas(70): Undeclared identifier: 'send'

[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Pode ser do stress mas não consigo resolver este dilema.

Um Abraço

---------------------------------------------

Ola Micheus,

Acho que a solução passa por aqui:

ComPort1.WriteStr(Header +Command +Source +Destination); //Envia a string de comandos

...enfim....

vou verificar o resto e já te digo mais alguma coisa...

Abraço amigão

José

---------------------------------------------

Alo Micheus,

De facto com este componente CPort, fica udo muito facil. Neste momento o problema esta quase resolvido. Optei por esta forma:

Header := Char($AA) +Char($55);

ComPort1.WriteStr(#$AA#$55#$03#$02#$1f); //Envia a string de comandos directamente,

A tua ajuda, uma vez mais, foi incomensurável. Amanha farei os restantes testes e logo te digo algo. Vou dormir que já se faz tarde e a carcaça reclama.

Próxima etapa e por isto tudo em Rede como Servidor....

Aquele abraço

Editado por Micheus
Adicionada linhas delimitadoras para melhor visualização. ;-)
Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, existe alguma forma de eu Ler no Label.Caption os valores em Hexa?

José, você quer dizer mostrar os valores em um label no formato decimal?

Se for isto você pode utilizar a função format. Veja exemplo, onde passo 3 valores como argumento:

Label1.Caption := Format('$%x, $%x, $%x', [20, 54, 56]);

O que diz a função para formatar o número inteiro, em hexa é o %x. O $ apenas será concatenado a string de modo a mostrar o resultado da seguinte forma: $14, $36, $38

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
por e-mail, visto que estava sem acesso ao forum

Ola Micheus,

Mil desculpas por te abordar directamente ao invés do Fórum, mas infelizmente onde estou de momento não tenho acesso ao Fórum. Se de facto for impertinente, peço que ignores este email com um pedido de desculpas. Entretanto podes publicar a dúvida, ou eu o farei se achares conveniente. A questão é a seguinte:

Gostaria de usar o comando CASE ... para melhorar ou condensar esta rotina:

Header:= Char($AA) +Char($55);
Aud:= Char($02);     //audio
Vid:= Char($01);     //video
VA:= Char($03);    //Video e Audio

if (LB0.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=True) and (LB00.StateOn=False) then
  ComPort1.WriteStr(Header+VA+#$00#$00)
  else
       if (LB0.StateOn=True) and (LBV.StateOn=False) and (LBA.StateOn=True) and (LB00.StateOn=False) Then
          ComPort1.WriteStr(Header+Aud+#$00#$00)
          Else
               if (LB0.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=False) and (LB00.StateOn=False) Then
                   ComPort1.WriteStr(Header+Vid+#$00#$00)
//*****************segundo botão***********************************
          else
       if (LB1.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=True) and (LB00.StateOn=False) then
  ComPort1.WriteStr(Header+VA+#$01#$00)
  else
       if (LB1.StateOn=True) and (LBV.StateOn=False) and (LBA.StateOn=True) and (LB00.StateOn=False) Then
          ComPort1.WriteStr(Header+Aud+#$01#$00)
          Else
               if (LB1.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=False) and (LB00.StateOn=False) Then
                   ComPort1.WriteStr(Header+Vid+#$01#$00)
//*****************************3ºbotão*********************************************
 else
       if (LB2.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=True) and (LB00.StateOn=False) then
  ComPort1.WriteStr(Header+VA+#$02#$00)
  else
       if (LB2.StateOn=True) and (LBV.StateOn=False) and (LBA.StateOn=True) and (LB00.StateOn=False) Then
          ComPort1.WriteStr(Header+Aud+#$02#$00)
          Else
               if (LB2.StateOn=True) and (LBV.StateOn=True) and (LBA.StateOn=False) and (LB00.StateOn=False) Then
                   ComPort1.WriteStr(Header+Vid+#$02#$00);
....e por aí afora. Aquele abraço José Da Silva
José, coloquei o código abaixo de forma mais organizada (para mim). Gostaria que você respondesse: - o que é LB0, LB1, LB2, LB00 ? - está correto o uso de LB00 em todos os if's ? - em que evento você está utilizando este seu código? - o código é o mesmo para os tais 3 botões que você colocou no comentário? E o código é assim mesmo, as operações para cada botão, seguem com o else? Dica: Um código mais profissional, não utiliza o teste de variáveis boolenas como você o fez: if LB0.StateOn = True ..., já que sendo a propriedade/variável booleana e a avaliação em um if também, não faz sentido perguntar o óbvio: if (True) = True then; você simplesmente pergunta if True then. Neste sentido, quando quiser verificar se não é true, basta testar utilizando o NOT: if false = false then, ficaria simplesmente: if not True then. Lembre-se que o if then é executado quando o resultado for true, do contrário ele executará o else.
begin
  Header:= Char($AA) +Char($55);
  Aud:= Char($02);     //audio
  Vid:= Char($01);     //video
  VA:= Char($03);    //Video e Audio

  if LB0.StateOn and
     LBV.StateOn and
     LBA.StateOn and
     not LB00.StateOn then
    ComPort1.WriteStr(Header+VA+#$00#$00)
  else
    if LB0.StateOn and
       not LBV.StateOn and
       LBA.StateOn and
       not LB00.StateOn then
      ComPort1.WriteStr(Header+Aud+#$00#$00)
    else
      if LB0.StateOn and
         LBV.StateOn and
         not LBA.StateOn and
         not LB00.StateOn then
        ComPort1.WriteStr(Header+Vid+#$00#$00)

  //*****************segundo botão***********************************
      else
        if LB1.StateOn and
           LBV.StateOn and
           LBA.StateOn and
           not LB00.StateOn then
          ComPort1.WriteStr(Header+VA+#$01#$00)
        else
          if LB1.StateOn and
             not LBV.StateOn and
             LBA.StateOn and
             not LB00.StateOn Then
            ComPort1.WriteStr(Header+Aud+#$01#$00)
          else
            if LB1.StateOn and
               LBV.StateOn and
               not LBA.StateOn and
               LB00.StateOn Then
              ComPort1.WriteStr(Header+Vid+#$01#$00)

  //*****************************3ºbotão**********************
            else
              if LB2.StateOn and
                 LBV.StateOn and
                 LBA.StateOn and
                 not LB00.StateOn then
                ComPort1.WriteStr(Header+VA+#$02#$00)
              else
                if LB2.StateOn and
                   not LBV.StateOn and
                   LBA.StateOn and
                   not LB00.StateOn Then
                  ComPort1.WriteStr (Header+Aud+#$02#$00)
                else
                  if LB2.StateOn and
                     LBV.StateOn  and
                     not LBA.StateOn and
                     not LB00.StateOn Then
                    ComPort1.WriteStr(Header+Vid+#$02#$00);
end;
Aguardo suas respostas. Verei minha caixa de mensagem amanhã apenas. Quinta a noite estarei viajando em férias e só retorno a acessar a net dia 17/12/2007. Abraços
por e-mail, visto que estava sem acesso ao forum Ola Micheus, Quanto as tuas questões: LB0 = LEDButton na Posição 0 (pertence ao "source"); LB00= LEDButton na posição 0 (pertence ao "destination"); // veja um snapshot em anexo Em relação aos IF´s a ideia é cumprir com o seguinte requisito: 1º O LED do botão tem de estar em StatOn senão não comuta;//Ou seja, só com o Led apagado acciona. StatOn é booleano. 2º O LED em StatOn selecciona a sua posição; 3º Só pode existir um Led em StatOn na coluna "source";//Só pode existir um Input para vários outputs A ideia seria usar uma especie de CASE para evitar longas linhas de scripts porque senão terei de repetir o mesmo para os sete LedBotões ....Ufa!! Seria bem mais fácil usar RadioGroup Button, como você fez no exemplo que me mandou. Penso que o snapshot lhe dará uma ideia do que se pretende... switchbuttonoq5.png Uma vez mais um muito obrigado pela força, Aquele abraço José Da Silva
José, ainda me sobraram algumas dúvidas, como por ex., se realmente o penúltimo char enviado é o nº do Source. Mas o código abaixo já dá uma simplificada no que você postou. Observe que: - utilizamos apenas uma linha para envio dos dados para a COM (ela não se repete mais); - inicializamos uma variável que diz qual o botão source selecionado (LBSource); - tratamos a seleção da opção Audio/Video em um único if.
procedure TForm1.Button3Click(Sender: TObject);
Const
  Header = Char($AA) +Char($55);
  Aud    = $02;  //audio
  Vid    = $01;  //video
var
  VA :Byte;   //Video e/ou Audio
  LBSource :Char;
begin
 // inicializa o botão Source pressionado
 // pelo seu exemplo, parece que o penúltimo caracter enviado para a
 // COM é o número do source - isto é real? Se for vale o que está abaixo.
  if LB0.StateOn then  // só haverá um LBx na posição StateOn
    LBSource := #00;
  else
    if LB1.StateOn then
      LBSource := #01;
    else
      if LB2.StateOn then
        LBSource := #02;

 // manipula flag de audio/video
  if LBV.StateOn then
    VA := Vid  // se ligado inicializa com Vídeo
  else
    VA := $00;
  if LBA.StateOn then
    VA := VA or Aud;  // se ligado adiciona o bit ref. Audio ao valor anterior

 // esta situação de LB00 não ficou clara
  if not LB00.StateOn then
    ComPort1.WriteStr(Header +VA +LBSource +#00);
end;
Ola Micheus, A ideia é ler os strings em Hexa no Label.Caption. Por exemplo: Label1.Caption := 'String enviada: ' +Header +Command +Source +Destination; Quero ler em Hexa ao invés de Char.
crie uma function para isto:
function CharsToHexa(StrSource :String) :String;
var
  I :Byte;
begin
  Result := '';
  for I := 1 to Length(StrSource) do
    Result := Result +Format('$%x', [Ord(StrSource[I])]);
end;

e chama assim:

Label1.Caption := 'String enviada: ' +CharsToHexa(Header +Command +Source +Destination);

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa Tarde companheiros,

Gostaria de partilhar convosco algumas soluções para a minha aplicação. Infelizmente ainda estou batalhando numa solução para funcionar em Rede. Não deixo porem de fazer referencia a preciosa colaboração do Micheus que permitiu que avanços preciosos. Um bem-haja por isso.

Assim,

LB1.StateOn:=false;
LB2.StateOn:=false;
LB3.StateOn:=false;
LB4.StateOn:=false;  {permite apenas um switch ligado de cada vez}
LB5.StateOn:=false;
LB6.StateOn:=false;
LB7.StateOn:=false;
...
         if not LB0.StateOn and
          LBV.StateOn or LBA.StateOn then              //apanes permite que seja enviado o string se o Led estiver off
          Setup.ComPort1.WriteStr(Header+#$03#$00#$1F);

  end;
procedure TMS8.LB00Click(Sender: TObject);
begin
{com ajuda do Micheus...}

// manipula flag de audio/video

  if LBV.StateOn then
      VA := Vid; // se ligado inicializa com Vídeo
            if LBA.StateOn then
               VA := Aud;  // se ligado adiciona o bit ref. Audio ao valor anterior
              if LBA.StateOn and LBV.StateOn  then
                 VA:= ViAu;    //se ligado audio e video


// inicializa o botão Source pressionado, o penúltimo caracter enviado  é o nº do source.

  if LB0.StateOn then  // Configura o LButtom para um determinado valor Hex em StateOn (ligado)
    LBSource := #00
  else
    if LB1.StateOn then
       LBSource := #01
      else
        if LB2.StateOn then
           LBSource := #02
           else
            if LB3.StateOn then
               LBSource:=#03
              else
                 if LB4.StateOn then
                      LBSource:=#04
                   else
                       if LB5.StateOn then
                          LBSource:=#05
                         else
                            if LB6.StateOn then
                               LBSource:=#06
                               else
                                  if LB7.StateOn then
                                     LBSource:=#07;


  If not LB00.StateOn  then
       Setup.ComPort1.WriteStr(Header+VA+LBSource+#$00);
   {soluciona o problema do botão acionar com o LED off}


      if  not LB00.StateOn and
      LBA.StateOn then
        LCD02.Indicatorstring := CharsToHexa(LBSource); //activa o valor numérico do LCD CrossPoint
//... (continua abaixo)
crosspointcp5.th.jpg
// continuação de cima
      if not LB00.StateOn and
      LBV.StateOn then
        LCD2.Indicatorstring := CharsToHexa(LBSource);

      if not LB00.StateOn and
      LBV.StateOn and
      LBA.StateOn then
        LCD02.Indicatorstring := CharsToHexa(LBSource);

      if not LB00.StateOn and
      LBV.StateOn and
      LBA.StateOn then
        LCD2.Indicatorstring := CharsToHexa(LBSource);

end;
A função...
function CharsToHexa(StrSource :String) :String;
var
  I :Byte;
begin
  Result := '';
  for I := 1 to Length(StrSource) do
    Result := Result +Format('%x', [Ord(StrSource[I])]);
end;
//*********************Quanto as Portas*********************
var
  Reg : TRegistry;
  Lista : TStrings;
  i : integer;

{Verifica se as existe portas }
begin
    ListBox1.Items.Clear;//apaga a repetição das lista de portas no listbox
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.OpenKey('Hardware\DeviceMap\SerialComm', false);
    Lista := TStringList.Create;
    try
      Reg.GetValueNames(Lista);
      for i := 0 to Lista.Count -1 do
        Listbox1.Items.Add(Reg.ReadString(Lista[i]));
    finally
      Lista.Free;
    end;
    Reg.CloseKey;
  finally
    Reg.Free;

  end;
end;
//Usei Componente ComPort que facilita enormemente o trabalho 
begin
  if ComPort1.Connected then
    ComPort1.Close
  else   //Abre ou fecha dependendo se esta ou não conectado (ex. retirado do próprio componente)
    ComPort1.Open;
end;

procedure TSetup.Button3Click(Sender: TObject);
begin
 ComPort1.ShowSetupDialog;// Abre o dialogo para ajuste da Porta 
end;

procedure TSetup.ComPortOpen(Sender: TObject);
begin
  Btn1.Caption := 'Fechar';
end;

procedure TSetup.ComPortClose(Sender: TObject);
begin
  if Btn1 <> nil then
    Btn1.Caption := 'Abrir';
end;

Para já é tudo,

Espero ter contribuido, quanto mais não seja para algumas duvidas ou futuras discussões saudáveis.

Aquele Abraço

José

África

Editado por Micheus
Adicionado o delimitador de código [code] [/code]. Lembre-se de utilizá-lo para melhor visualização
Link para o comentário
Compartilhar em outros sites

  • 0

Boa Noite companheiros,

Venho, para já desejar um Ano Novo próspero e, anunciar que o meu servidor já da indicações de vida após este interregno próprio da quadra festiva. Espero postar dentro de dias o código.

Uma vez mais um grande abraço a todos e, em especial, ao Micheus.

MC

José

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...