Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Seri Port dan String Alma

Başlatan GamzeDemir, 07 Ekim 2009, 17:54:32

GamzeDemir

Merhaba Arkadaslar

Hitech de usart dan string alan bi fonksiyon var mı acaba? benim elimdeki usart.c ve h dosyalarında tek bir karakter alan ve veren fonksiyonlar vardı ben de bunu kullanarak kendi programı mı yazayım dedim ama sanırım calısmıyor.. Tek karakterde sorun cıkarmıyor ama pc den string gonderdiğimde tık yok  :oops: 5 karakterlik bir char dizi tanımladım ve eger bir string gelirse son karakterii null olur dusuncesiyle null karakter gelene kadar bu char diziye atama yapsın istedim ve en son bu diziyi de tekrar pc ye gonderecek dogru alıp almadıgını kontrol için boyle bi sart koydum.. ama calısmıyor acaba nerde hata yapmıs olabilirim :?

#include<pic.h>
#include"delay.h"
#include<stdio.h>
#include"sci.h"

__CONFIG(WDTDIS&XT&LVPDIS);	

#undef	XTAL_FREQ
#define	XTAL_FREQ	4MHZ		/* Crystal frequency in MHz */


main(void)
{

	unsigned char bilgi[5];
	int i=-1;	

	TRISB=0;
	PORTB=0;
	TRISD=0;
	PORTD=0;

	TRISC=0b10000000;//RC7 rx yani input
	PORTC=0;

	RD1=1;
	sci_Init(9600,SCI_EIGHT);
	for(;;)
	{
		RD0=1;
		DelayMs(250);
		RD0=0;
		DelayMs(250);
		
		DelayMs(100);

		while(1)
		{

		       do 
		 	{
				i++;
    			bilgi[i] = sci_GetByte();
				
			} while(bilgi[i]!=0x00);

			printf(bilgi);
			RD4=1;
			DelayMs(250);
			RD4=0;
			DelayMs(250);
		}

		DelayMs(250);
		DelayMs(250);

	}	
}

GamzeDemir

Slm Arkadaslar

Umarım yardım eden biri cıkar.. Cunku sinir oldum bu scanf fonksiyonuna ...

Derleyicinin manual ini okuyorum asagıdaki gb bir ornek veriyor...

double j;
scanf("%lf", &j);


ama ben derleyicimde aynı kodu derliyorum ama hata veriyor...

İnternette arastırdım baska ornekler bulayım diye

char ad;
    char soyad;
    
    scanf("%s %s", &ad, &soyad);
    printf("Okudum: %s %s\n", ad, soyad);

  


Yukardaki kodu kendime uyarladım derleyebilmek için ama nafile gene hata veriyor derleyici scanf e undefined symbol diyor

#include<pic.h>
#include"delay.h"
#include<stdio.h>
#include"sci.h"

__CONFIG(WDTDIS&XT&LVPDIS);	

#undef	XTAL_FREQ
#define	XTAL_FREQ	4MHZ		/* Crystal frequency in MHz */


main(void)
{
	unsigned char data='E';	
	char ad;
    char soyad;    

	TRISB=0;
	PORTB=0;
	TRISD=0;
	PORTD=0;

	TRISC=0b10000000;//RC7 rx yani input
	PORTC=0;
	
	RD1=1;
	//sci_Init(9600,SCI_EIGHT);
	for(;;)
	{
		RD0=1;
		DelayMs(250);
		RD0=0;
		DelayMs(250);


		while(1)
		{    
		    scanf("%s %s", &ad, &soyad);
		    printf("Okudum: %s %s\n", ad, soyad);		
		}
	}	
}


Hata

HI-TECH C PRO for the PIC10/12/16 MCU family  V9.60PL3
Copyright (C) 1984-2008 HI-TECH SOFTWARE
Error   [499] ; 0. undefined symbol:
	_scanf(yettin.obj)


Lütfen yardım :(

PROTECH_

a.slm

öncelikle anlamadığım iki nokta var

-1. si :
for(;;) 
   { 
      RD0=1; 
      DelayMs(250); 
      RD0=0; 
      DelayMs(250); 
       
      DelayMs(100); 

      while(1) 
      { 

             do 
          { 
            i++; 
             bilgi[i] = sci_GetByte(); 
             
         } while(bilgi[i]!=0x00); 

         printf(bilgi); 
         RD4=1; 
         DelayMs(250); 
         RD4=0; 
         DelayMs(250); 
      } 

   DelayMs(250);  // ??
    DelayMs(250); //??

   }  


sondaki "DelayMs(250);"  ne amaçla kullanmak istediğin, çünki
"while(1)" den dolayı while() döngüsünün dışına cıkılmıyor ve doğal olarak onlar hiçbir zaman işlenmiyor...

2. si ben seri iletişim için assembly kullandım orda bilgi alındığı zaman kesme meydana gelir ve bilgi kesme rutini bloğundan alınır değişkenlere atanırdı, kullandığın librarylerin içeriğini iyi bilmiyorum ama ben kesme rutinine dair birşey göremedim...
datasheet e bakarak kendin bi library hazırlaman daha kolay olurdu bence...

kolay gelsin..
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

ErsinErce

#define XTAL 20 // 20MHZ
void init_usart(unsigned long baud){
	TRISC7=1;TRISC6=0;
	RCSTA=0x90;
	TXSTA=0x24;
	SPBRG=((XTAL*1000000/16)/baud)-1;
}
void putc_usart(unsigned char c){
	while(!TXIF);
	TXREG = c;
}
unsigned char getc_usart(void){
	unsigned char c;
	while(!RCIF);
	c = RCREG;
	if(OERR){
		CREN=0;FERR=0;
		CREN=1;c=0;
	}
	return c;
}
void puts_usart(const char *s){
	do{
		putc_usart(*s);
	}while(*++s);
}
void gets_usart(unsigned char *buffer, unsigned char len){
	unsigned char i;
	for(i=len;i!=0;i--){
		*buffer = getc_usart();
		putc_usart(*buffer);  // basılan tuşu göster
		buffer++;
	}
}


Bu kodlar karakter girilene kadar beklemesi için tasarlanan çalışan kodlardır,  diğer işlemlerin aksamaması için interrupt yardımıyla karakterler alınmalıdır.
Kütüphanenin içeriğini bilmediğim için bir yorum getirmem imkansız umarım bu kodlar bir yol gösterir.