Problemas de cast com comunicação serial

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Problemas de cast com comunicação serial

Mensagempor cabral » 14 Mar 2007 16:28

Pessoal,

Estou tendo um problema confuso:

Envio um conjunto de 18 bytes para a interface serial do uC MC56F8013. Utilizo o bean de comunicação serial assíncrona e recebo todos os bytes porém, se recebo os bytes e os armazeno em um array de 18 bytes tudo funciona numa boa mas se utilizo um array (struct) composto de 2 bytes + 4 longs o programa simplesmente ignora os 2 últimos bytes!!! Ele faz os cast dos bytes para long (juntando 4 bytes seguidos) perfeitamente até o 3º long do meu array. No último long, como ele ignora os 2 últimos bytes, fico com um valor errado, formado de apenas 2 bytes, como um int. Já tentei receber tudo em bytes e eu mesmo "na mão" fazer os deslocamentos de bit e concatenar os 4 bytes para formar o long mas não sei porque também não funciona.. se usar o operador << com um deslocamento maior que 8 bits o programa confude os valores todos...

Alguém tem alguma idéia do que pode estar acontecendo???? Alguém já passou por esse tipo de problema?

Desde já agradeço a atenção.

Abraços,
Daniel Cabral
cabral
 
Mensagens: 3
Registrado em: 29 Jan 2007 14:58

Que tal usar uma union?

Mensagempor rafaelntg » 15 Mai 2007 14:04

Cabral,
a impressão que tenho é que existe algum problema em relação aos 2 bytes iniciais (anteriores aos 4 longs) e os dois bytes finais da struct (final do último long), algo do tipo: o que deveria ser armazenado nos 2 primeiros bytes do primeiro long está sendo armazenado nos 2 campos tipo byte iniciais, faltando assim 2 bytes para completar o último long.
Caso o problema não tenha relação nenhuma com o que imaginei, a sugestão que dou é você utilizar uma "union", inserindo o vetor de 18 bytes para receber os dados, o que comprovadamente funciona, e a estrutura (struct) de 2 bytes + 4 longs para acessar os dados recebidos de uma forma mais intuitiva. Deve funcionar normalmente, já que eles irão compartilhar o mesmo espaço de memória.
O que você acha, não fica mais fácil e intuitivo assim?
--
Exemplo de declaração:
union{
byte _Dados_Recebidos[18];
struct{
byte _Campo1;
byte _Campo2;
long _Campo3;
long _Campo4;
long _Campo5;
long _Campo6;
} _Campos;
} _Serial;
#define Dados_Recebidos _Serial._Dados_Recebidos
#define Campo1 _Serial._Campos._Campo1
#define Campo2 _Serial._Campos._Campo2
#define Campo3 _Serial._Campos._Campo3
#define Campo4 _Serial._Campos._Campo4
#define Campo5 _Serial._Campos._Campo5
#define Campo6 _Serial._Campos._Campo6

Exemplo de uso:
Dados_Recebidos[i] = Y; //Preenche o vetor com os dados recebidos
X = Campo4; //Acessa o campo com a informação desejada
--

Espero ter ajudado!

Um abraço!
Até mais!
Rafael Noronha
rafaelntg
Bit
 
Mensagens: 10
Registrado em: 12 Mar 2007 10:46
Localização: Santa Rita do Sapucaí/Brazópolis - MG


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x