你好,du0000001,CinziaG和NothGuy非常想帮助我。du0000001,这些是我的枚举,这是我的枚举ESTADO_AGUARDA_FIM_ENVIO_断裂}ENM_ENVIO_ENVIO_破坏}ENUM_EST_ESTADO_ESTAD_ESTADO_OUVINDO_A_RE_A_REDE=0u,ESTADO_RECEBE_RECEBE_ENDEDEDEDEDEDEDEDERERERERERERE_DEDEDEDEDEDEDEDEDEDEDEDEDEDERERERERERERERERE_ENDEDEREREREREREREREBE_NUMERERERO_BYTES_RS485,ESTADO_RECEBEBE_BYTE_BYTES_RS485,ESTADO_READO_RECEBE_BYTE_BYTES_RS485,ESTENVIA_BYTE_1_RESPOSTA_POLLING,ESTADO_ENVIA_BYTE_2_RESPOSTA_ESTADO_LIBERA_LINHA_LINHA_RESPOPOSTA_极化,ESTADO_VERIFICA_LINHA_ENVIA_ENVIA_极化,ESTADO_ENVIA_ENVIA_BYTE_BYTE_2_ENVIA_极化,ESTADO_LIBERA_LIBERA_LINHA_ENHA_ENHA_ENVIA_极化,ESTADO_AGUARDA_PRI_PRI_ENVIA_PRI_ENVIA_极化,ESTADO_AAGUARDA_PRI_PRI_ENVIA_PRI_ENVIA_极化_极化,ESTADO_AAAAGUARDA_PRI_PRI_ENVIPOSTA_POLLING,ESTADO_VERIFICA_LINHA_ENVIA_COMANDO,ESTADO_VERIFICA_ENDERE_ENDERECO_DEDEDEINO_ENVIA_COMANDO,ESTADO_VERIFIFICA_NNNNNNNNNNNNBYTES_ENVIA_COMANDO,ESTADO_VER_VERIFIFIFIFICA_ENDEDERERERERERE_ENDEDEDEDEDERERECO_DEDEDEDEDEDEDEDERECOENVIA_ENINVIA_ENVIA_COMANANDO,ESTADO_AGUARDA_AAAGUARDA_RESPOSTA_RESPOSTA_COMANSTA_COMANSTA_COMANDO,ESTADO_PROPROPROPRO_PROSTA_COMANSTA_COMANSTA XIMO_COMANDO,ESTADO_ENVIA_BYTE_1_RESPOSTA_OK,ESTADO_ENVIA_BYTE_2_RESPOSTA_OK,ESTADO_LIBERA_LINHA_RESPOSTA_OK,ESTADO_VERIFICA_LINHA_ENVIA_BREAK,ESTADO_POLARIZA_LINHA_ENVIA_BREAK,ESTADO_LIBERA_LINHA_ENVIA_BREAK}ENUM_ESTADO_MAQUINA_ENVIO_RECEBIMENTO,因此我不认为这是我的问题。所有的值都是字节类型。使用字节替代EnUM的结果是相同的…如果我只是测试变量是否与0不同,它返回true,但是当我复制值时,它似乎变为零(0)。它“固定”了这个问题,但我不明白为什么…我的变量MaqaNeNeViReCeimimTrrss48和MaqTaTaReaFrEDE并没有在启动代码中初始化。我知道我应该初始化(我的错误),但是为什么会这样呢?为了使思路清晰,我的主要循环是:如果某些东西不是预期的,函数PrimeSeRixARIXB()返回true。因此,我做了一个温暖的重新启动,打破了循环,并发送到另一个循环,你可以看到,初始化所有变量在我的程序,除了STATUS看门狗,持有重要的价值为我的调试。在我看来,在SimeSeReNICIARARB中,AtditStastStaseWestRe狗[1 ] = MaqTaTaRealDeaStutuStWistBoe[9]=MaqNeaNeViReCeBeimiTrrsSt55的工作原理在我开始初始化两个枚举时都很好。如果不是,statusWatchdog变为0(0),除非我输入一个字面值,比如this statusWatchdog[1]=0x55;statusWatchdog[2]=0xAA;在这种情况下,值仍然是0x55和0xAA。问题只发生在属性变量并且不在启动时初始化这些变量时。看起来,这个属性成了一个指针。我知道我的声明听起来很奇怪,但是我不能理解目前为止发生了什么。我在这两种情况下都查看了拆卸过程。他们是平等的。你能告诉我一些测试来理解这种行为吗?或者如果还不清楚,你想要什么样的信息?再次为你的时间!
以上来自于百度翻译
以下为原文
Hi du0000001, CinziaG and NothGuy tks very much for help me.
du0000001, these are my enums
typedef enum
{
ESTADO_SELECIONA_TAREFA = 0u,
ESTADO_RESPONDE_POLLING,
ESTADO_AGUARDA_FIM_ENVIO_RESPOSTA_POLLING,
ESTADO_ENVIA_COMANDO,
ESTADO_AGUARDA_FIM_ENVIO_ENVIA_COMANDO,
ESTADO_ENVIA_BREAK,
ESTADO_AGUARDA_FIM_ENVIO_BREAK
}ENUM_ESTADO_MAQUINA_TAREFA_REDE;
typedef enum
{
ESTADO_OUVINDO_A_REDE = 0u,
ESTADO_RECEBE_ENDERECO_DESTINO_RS485,
ESTADO_RECEBE_NUMERO_BYTES_RS485,
ESTADO_RECEBE_BYTES_RS485,
ESTADO_VERIFICA_LINHA_RESPOSTA_POLLING,
ESTADO_ENVIA_BYTE_1_RESPOSTA_POLLING,
ESTADO_ENVIA_BYTE_2_RESPOSTA_POLLING,
ESTADO_LIBERA_LINHA_RESPOSTA_POLLING,
ESTADO_VERIFICA_LINHA_ENVIA_POLLING,
ESTADO_ENVIA_BYTE_1_ENVIA_POLLING,
ESTADO_ENVIA_BYTE_2_ENVIA_POLLING,
ESTADO_LIBERA_LINHA_ENVIA_POLLING,
ESTADO_AGUARDA_PRIMBYTE_ENVIA_POLLING,
ESTADO_AGUARDA_RESPOSTA_POLLING,
ESTADO_VERIFICA_LINHA_ENVIA_COMANDO,
ESTADO_VERIFICA_ENDERECO_DESTINO_ENVIA_COMANDO,
ESTADO_VERIFICA_NUMERO_BYTES_ENVIA_COMANDO,
ESTADO_ENVIA_BYTES_ENVIA_COMANDO,
ESTADO_LIBERA_LINHA_ENVIA_COMANDO,
ESTADO_AGUARDA_PRIMBYTE_ENVIA_COMANDO,
ESTADO_AGUARDA_RESPOSTA_COMANDO,
ESTADO_PROXIMO_COMANDO,
ESTADO_ENVIA_BYTE_1_RESPOSTA_OK,
ESTADO_ENVIA_BYTE_2_RESPOSTA_OK,
ESTADO_LIBERA_LINHA_RESPOSTA_OK,
ESTADO_VERIFICA_LINHA_ENVIA_BREAK,
ESTADO_POLARIZA_LINHA_ENVIA_BREAK,
ESTADO_LIBERA_LINHA_ENVIA_BREAK
}ENUM_ESTADO_MAQUINA_ENVIO_RECEBIMENTO;
So I don´t believe it is the problem in my case. All values are BYTE type.
The result using BYTE instead ENUM was the same...if I just test if my variable is different from zero it returns TRUE, but when I copy the value it seems that become zero (0).
I did another test with a interesting result. It "fixed" the problem but I can´t understand why...
My variables maquinaEnvioRecebimentoRS485 and maquinaTarefaRede wasn´t initialized at the start-up code. I know that I should initialize (my fault), but why this interfere??
Just to make thinks clear
My main loop is:
void main(void)
{
InicializacaoVariaveisWatchdog_B();
VerificaWatchdogPorTravamento_B();
while (1)
{
Inicializacao_B();
for(;;)
{
CLRWDT();
VerificaFlags_B();
if (PrecisaReiniciar_B())
{
break;
}
}
}
}
The function PrecisaReiniciar_B() return TRUE if something isn´t as expected. So I made a kind of warm reboot, breaking the loop and send to a another loop as you can see, initializing all variables in my program, except statusWatchdog that holds important values for my debug.
It seems to me that the attributions
statusWatchdog[1] = maquinaTarefaRede
statusWatchdog[2] = maquinaEnvioRecebimentoRS485
in the PrecisaReiniciar_B works fine just when I initialize both enumerations in the beginning. If I don´t, the statusWatchdog become zero (0), except if I put a literal value, like this
statusWatchdog[1] = 0x55;
statusWatchdog[2] = 0xAA;
In this case, the values still 0x55 and 0xAA. The problem occurs only when attribute the variables and don´t initialize this variables on the start-up. Looks like the attribution become a pointer.
I know my statement sounds weird, but I can´t understand what is happening so far.
I´ve looked the disassembly in both cases. They are equal.
Can you tell me some tests to do to understand this behavior??
Or if was not clear, what kind of information do you want?
Tks again for your time!