Pergunta

Eu estou fazendo um microcontrolador 8051 comunicar sem fios com um computador. O microcontrolador irá enviar uma cadeia à sua porta serial (DB9) eo computador receberá esta corda e manipulá-lo.

O meu problema é que eu não sei como fazer a transmissão 8051 a corda apenas uma vez. Desde que eu preciso para manipular a corda no final PC tem que ser recebida apenas uma vez. Atualmente, embora no código C Estou enviando a corda uma vez, no meu computador que eu estou recebendo a mesma seqüência continuamente. Suponho que isso é porque o que está no SBUF é continuamente transmitido. Existe alguma maneira que eu posso enviar a minha corda apenas uma vez? Existe uma maneira de esvaziar a SBUF?

Eu tentei usar o RTS (Request to Send) pino (7 de pino) no DB9, porque eu li em algum lugar que se eu negada a tensão em que o pino que iria parar o fluxo de dados para a porta serial. Então o que eu fiz foi programado o meu microcontrolador para enviar a corda e, em seguida, enviado nível lógico 0 para um pino de saída que foi conectado ao meu pino DB9 RTS. No entanto, isso não funcionou.

Alguém tem alguma sugestão? Eu realmente apreciá-los.

Editar

O software que eu estou usando no PC é X-CTU para módulos Xbee. Este é o código no meu microcontrolador:

include reg51.h 
void SerTx(unsigned char);  
void main(void)  
{  
  TMOD = 0x20;  
  TH1 = 0xFD;  
  SCON = 0x50;  
  TR1 = 1;   

  SerTx('O');  
  SerTx('N');  
  SerTx('L');  
  SerTx('Y'); 

}

void SerTx(unsigned char x)  
{  
  SBUF = x;  
  while(TI==0);   
  TI = 0;   
}  

Alguém por favor poderia verificar se ele é na verdade apenas o envio a corda uma vez?

Editar

Looks como Steve, brookesmoses e Neil bater o prego na cabeça quando eles disseram que era o que estava a acontecer depois da minha função principal que estava causando o problema. Eu apenas tentei o código sugeriu Steve colocar (mais especificamente o for (;;), e definindo serTX fora do principal) e ele funcionou perfeitamente. O controlador provavelmente é reiniciado e, portanto, o mesmo código continua se repetindo.

Muito obrigado pela ajuda! :)

Foi útil?

Solução

Pode confirmar que o 8051 realmente está enviando os dados apenas uma vez? Uma maneira de verificar seria a utilização de um escopo para ver o que está acontecendo no pino TX do UART.

O software que você está usando no PC? Eu sugiro usar o software de comunicação simples como HyperTerminal ou PuTTY . Se eles estão mostrando a corda que está sendo enviado para o PC várias vezes, então as chances são a falha está no software em execução em 8051.

EDIT: Para ser honesto, isso soa como o tipo de depuração que os engenheiros têm de enfrentar em uma base regular, e por isso é uma boa oportunidade para você praticar boa problema- metódica à moda antiga solving.

Se eu pode ser muito franco, eu sugiro que você faça o seguinte:

  1. Debug. Experimentar as coisas, mas não acho . Experimentar. Faça pequenas alterações em seu código e ver o que acontece. Experimente tudo o que você pode pensar. Pesquisar na web para obter mais informações.
  2. Se isso não produzir uma solução, então voltar aqui, e nos fornecer todas as informações que precisamos. Isso inclui peças relevantes do código, detalhes completos do hardware que você está usando, e informações sobre o que você tentou na etapa 1.

EDIT: Eu não tenho o representante para editar a questão, então aqui está o código postado pelo OP no comentário à sua pergunta:

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    TMOD = 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1;
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    void SerTx(unsigned char x)
        { SBUF = x; while(TI==0); TI = 0; } 
}

Como Neil e Brooksmoses menção em suas respostas, em um sistema embarcado, a função principal é nunca permitiu a terminar. Então você quer necessidade de colocar seu código em um loop infinito (que pode ser o que está acontecendo inadvertidamente), ou adicionar um loop infinito, no final, para que o programa efetivamente paradas.

Além disso, a função SerTx deve ser definida fora principal. Isso pode ser syntatically correto, mas ele mantém as coisas simples não declarar funções dentro de outras funções.

Então, tente isso (Eu também acrescentou alguns comentários em uma tentativa de tornar o código mais fácil de entender):

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    /* Initialise (need to add more explanation as to what
        each line means, perhaps by replacing these "magic
        numbers" with some #defines) */
    TMOD = 0x20;
    TH1  = 0xFD;
    SCON = 0x50;
    TR1  = 1;

    /* Transmit data */
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    /* Stay here forever */
    for(;;) {}

}

void SerTx(unsigned char x)
{
    /* Transmit byte */
    SBUF = x;

    /* Wait for byte to be transmitted */
    while(TI==0) {}

    /* Clear transmit interrupt flag */
    TI = 0;
} 

Outras dicas

O código que você postou tem nenhum laço em main (), então você precisa para determinar o que C tempo de execução do seu compilador faz retorna quando main () após o envio de 'Y'. Dado o seu problema, eu imagino o compilador gera algum código para fazer alguma limpeza, em seguida, reiniciar o micro (talvez uma redefinição de hardware, talvez apenas ser reiniciar o tempo de execução C). Parece que o seu programa funciona exatamente como você escreveu isso, mas você ignorou o que acontece antes e depois de main () é chamado.

Se você quer sua seqüência enviada uma única vez, nunca, em seguida, você precisa de algo como while(1) {} adicionado após o último caractere é enviado. Mas, em seguida, seu programa não está fazendo nada - ele só vai executar um loop vazio para sempre. É necessário um reset (tais como o ciclo de alimentação) para iniciar novamente, e enviar a string.

Note que, se o seu micro tem um watchdog timer, pode intervir e forçar uma reinicialização inesperada. Se isso acontecer, o texto será enviado uma vez para cada reinicialização watchdog (que poderia ser algo como uma vez a cada segundo, com a taxa dependendo do seu hardware).

Além disso, ter serTx () definido aninhado dentro de main () não é provavelmente o que você quer.

É difícil dizer qual é o problema sem ver nada do código 8051. Por exemplo, um erro de lógica desse lado poderia levar ao ser dados enviados várias vezes, ou o software de 8051 pode estar à espera de um ACK que nunca é recebida, etc.

Normalmente em um código de 8051 tem que enviar expressamente cada personagem, mas eu suponho que este é cuidado por você, o C-tempo de execução.

O uso do RTS / CTS (Request To Send / Clear To Send) é para controle de fluxo (ou seja, para evitar tampão derrapagens - os tampões são geralmente muito pequena sobre estes microcontroladores). E não para transmissão parar completamente

A resposta de Ecoando Neil (em uma resposta, já que eu ainda não tenho o representante ao comentário): Em uma situação típica microcontrolador sem um sistema operacional, não é imediatamente claro o que a função exit () que é chamado implicitamente no final de main () deve fazer -. ou, mais precisamente, ele não pode fazer o usual "terminar o programa e voltar para o oS", porque não há nenhum sistema operacional para retornar ao

Além disso, em um aplicativo real, você quase nunca querem que o programa apenas para parar, a menos que você desligar o sistema. Então, uma coisa que a implementação exit () definitivamente não deve fazer é pegar um monte de espaço de código.

Em alguns sistemas em que já trabalhei, exit () não está implementada em todos - se você não está indo para usá-lo, nem sequer perder um byte nela! O resultado é que, quando o caminho de execução chega ao fim do main (), o chip apenas divagar em uma terra lala de executar tudo o que acontece de estar no próximo bit de memória, e tipicamente rapidamente acaba seja preso em um loop ou falha com um código de operação ilegal. E o resultado normal de uma falha com um código de operação ilegal é ... reiniciar o chip.

Isso parece uma teoria plausable para o que está acontecendo aqui.

Este artigo particular é para a montagem, não C, mas pode ser útil: http://www.8052.com/tutser.phtml

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top