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

Porta COM


cpereira

Pergunta

Olá a todos,

estou a desenvolver um projecto onde tenho de ler dados recebidos na porta COM. Estou a usar o System.IO.Ports para trabalhar com a porta COM.

O problema é o seguinte:

Eu tenho de ler pacotes de 32 bytes, pelo que coloquei a propriedade

comPort.ReceivedBytesThreshold = 32;

, ou seja, o evento DataReceived só é despoletado quando existirem 32 bytes no buffer para serem lidos.

Pelo que percebi, é criado um buffer interno (de software) onde são armazenados os dados e é a esse buffer que o método Read() vai ler os dados.

A questão é que em alguns casos poderei receber mais do que um pacote quase ao mesmo tempo, e o que acontece é que não é despoletado um novo evento mas sim o seguinte:

- Recebo 1 pacote 32 Bytes

- Recebe inicio de outro pacote

- Cria buffer interno com >32 Bytes a ler

- Despoleta o evento DataReceived

- Leio 32 Bytes do 1º pacote, fica o inicio do 2º pacote no buffer da porta COM

Ao fazer isto "perco" o inicio do 2º pacote só recebendo o resto na próxima vez que o evento DataReceived for despoletado, ou seja acontece o seguinte:

- Detecta 32 Bytes na porta COM

- Cria buffer interno com > 32 Bytes a ler

- Lê o resto do 2º pacote mais o inicio do 3º, fica o resto do 3º pacote no buffer da porta COM

O que vai acontecer é que vou andar sempre "dessincronizado" na recepção dos pacotes.

Existe alguma forma de ir ler directamente ao buffer da porta COM e não ao buffer interno que é criado ao serem recebidos dados?

Desde já muito obrigado pela atenção

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Você pode tentar usar a propriedade BaseStream do objeto para tentar acessar o buffer interno (nunca experimentei em uma porta COM, mas já usei essa propriedade em outros casos e deu certo).

Agora, quando você faz a leitura dos 32 primeiros bytes, existem mais do que 32 bytes a serem lidos? Se tiver, não daria pra você guardá-los (em uma variável estática) e juntar com a próxima leitura (a fim de formar os próximos 32 bytes) e guardar o resto na variável estática... e assim por diante?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Peço desculpa pela ausência. Obrigado pela resposta.

Você pode tentar usar a propriedade BaseStream do objeto para tentar acessar o buffer interno (nunca experimentei em uma porta COM, mas já usei essa propriedade em outros casos e deu certo).

Ainda não experimentei, obrigado pela sugestão.

Agora, quando você faz a leitura dos 32 primeiros bytes, existem mais do que 32 bytes a serem lidos? Se tiver, não daria pra você guardá-los (em uma variável estática) e juntar com a próxima leitura (a fim de formar os próximos 32 bytes) e guardar o resto na variável estática... e assim por diante?

Daria para fazer, mas isso iria causar um efeito não desejado, que é o seguinte:

O sistema tem de registar uns valores que vem no pacote no instante em que são recebidos.

Ao ser despoletado o evento DataReceived é criado um buffer com os bytes do 1º pacote mais alguns do 2º. Ao deixar o 2º pacote em "standby" iria fazer com que todos os outros pacotes começassem a não ser recebidos por inteiro e então iriam ficar sempre pacotes em "standby".

Vou experimentar a solução com a BaseStream e ver no que dá.

Abraço

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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...