Ir ao conteúdo
  • Cadastre-se

Receber dados RS232 sem interronper o LOOP (kbhit()??)


Pc100

Posts recomendados

O código de exemplo que estou usando é esse:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES INTRC_IO //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOMCLR //No MCLR

#use delay(clock=4000000)
#include <lcd_flex.c>
#use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A0) // Seta o baud rate para 9600, e define o pino B2 como TX e B1 como RX

char x[33]; //Variavel do tipo char com 32 posições ultimo valor fim da string

void print();

void main(void) // função principal
{
delay_ms(200);
lcd_init(); // Inicializa o LCD
delay_ms(100); //tempo para inicializar a conexão
printf("Conectado!\n\r"); // Manda esta mensagem para o terminal
while(1)
{
printf("Envie a string\n\r");
gets(x); // pega a string e coloca na variavel x
print();
}
}

void print()
{
int a;
printf(lcd_putc,"\f",);
for(a=0;a<33;a++)
{
if (a == 16)
printf(lcd_putc,"\n",);
printf(lcd_putc,"%c", x[a]);
}
for(a=0;a<33;a++)
x[a] = ' ';
}

Assim eu posso enviar e receber os dados pelo Hyperterminal, só q eu gostaria para outro projeto, receber os dados e colocar na string sem interromper o looping como esta neste código, alguém saberia me dizer?

Pensei em usar o kbhit() mas n consegui!

Agradeço já antecipadamente!

Link para o comentário
Compartilhar em outros sites

Dê uma olhada na interrupção RDA.

Exemplo:

#include <18f4550.h>

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,CPUDIV1,VREGEN
#use delay (clock = 48000000)
//------------------------------
#define WireTX PIN_C6
#define WireRX PIN_C7 //<-----
//------------------------------
#use rs232(baud=9600,parity=N,xmit=WireTX , rcv=WireRX ,bits=8,ERRORS , STREAM=Wireless)
unsigned int8 data;
int flag=0;

#define IN1 PIN_B1 //Pinos de controle do L293D
#define IN2 PIN_B2
#define IN3 PIN_B3
#define IN4 PIN_B4

#int_rda
void rd_isr(void)
{
disable_interrupts(INT_RDA); // Disable Serial Recieve Interrupt
disable_interrupts(GLOBAL); // Disable Global Interrupts

data= fgetc(Wireless);
if(data=='U')
{
flag=1;
}

if(data=='R')
{
flag=2;
}

if(data=='D')
{
flag=3;
}

if(data=='L')
{
flag=4;
}

if(data=='S')
{
flag=5;
}

enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
}

void main()
{
enable_interrupts(int_rda);
enable_interrupts(global);

output_high (PIN_D2);

for(;
{
Switch (flag)
{
Case 1:
{

output_low (IN2);
output_low (IN3);

output_high (IN1);
output_high (IN4);
break;
}

Case 2:
{

output_low (IN2);

output_low (IN4);
output_high (IN1);
output_high (IN3);
break;
}

Case 3:
{
output_low (IN1);

output_low (IN4);
output_high (IN2);
output_high (IN3);

break;
}

Case 4:
{
output_low (IN1);

output_low (IN3);

output_high (IN2);
output_high (IN4);
break;
}

Case 5:
{
output_low (IN1);
output_low (IN2);
output_low (IN3);
output_low (IN4);
break;
}

flag=0;
}
}
}

Falou

Link para o comentário
Compartilhar em outros sites

Estou fazendo em C no computador um programa para controlar o que sera enviado e recebido controlador, o programa esta funcionando, só que quando ele recebe uma informação, a primeira linha vem sempre sendo a ultima coisa que enviei, e depois o resto normal, segue o código:

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "windows.h"
#include "string.h"
#include "rs232.c"

#define port 0

unsigned char comando[5]; // comando a ser enviado
unsigned char buff[1024]; // comando recebido

int main(void) // Função principal
{
RS232_OpenComport(port,9600); // abre a porta desejada (ver documentação)
receber();
return 0;
}

void receber()
{
int n;
while (1)
{
n = RS232_PollComport(port,buff,1024); // n != 0 se tiver algo pra ser recebido
if(n != 0)
{
RS232_PollComport(port,buff,1024);
printf("%s", buff);
lipabuff();
_sleep(100);
}
else if (kbhit()) //se nada a receber e precinar alguma tecla
{
enviar();
lipabuff();
}
}
}

void enviar()
{
gets(comando); // Pega o comando e coloca na variavel comando
strcat(comando,"\n\r"); // adiciona uma quebra de linha (mais por motivos esteticos se for testar em terminal ou quardar log)
RS232_cputs(port,comando); // manda o comando para a porta serial (ou USB com FTDI)
_sleep(100); // delay de 200 milisegundos necessario para a sincronização (pode ser de 100)
}

void lipabuff()
{
int a;
for(a=0;a<1024;a++)
buff[a] = NULL;
}

A biblioteca que usei é esta: http://www.teuniz.net/RS-232/

o código q esta rodando no microcontrolador é o do primeiro post!

O q devo fazer para parar de receber a o comando q enviei? testando no hyperterminal do windows ele n recebe devolta, funciona certinho!

Link para o comentário
Compartilhar em outros sites

No inicio de sua rotina "void receber()",experimente "int n=0"

Ok, vou fazer isso!

Eu poderia criar uma função que ignore a primeira linha recebida do controlador, o q seria a mesma função q enviei, e coloque o resto da string como retorno, mas eu preciso ir comparando posição por posição do vetor char até achar a quebra de linha, mas n sei como especificar a quebra na if para localizar onde parar!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!