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?
Pergunta
cpereira
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
, 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
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.