Arkadaşlar öncelikle merhaba. Hi-tech ile seri haberleşme yapıyorum fakat şöyle bir sorunla karşılaştım. TX de yolladığım veriyi pic görüyor ancak tek karakter olarak algılıyor mesela virtuala 12 yazdığım zaman önce 1 sonra 2 olarak görüyor ben ise 12 (on iki) olarak görmesini istiyorum bunun için RX de interrupt yapmam gerekiyormuş ancak nasıl yapacağımı tam olarak bilmiyorum. Yani ben entere basana kadar yazdığım karakterleri toplayıp bastıktan sonra karakterin hepsini almasını istiyorum.
Bir tampon(buffer) oluşturacaksınız.
örn:
char tampon[100];
Sonra kesme(interrupt) oluşturacaksınız
her gelen veriyi tampon değişkenine ekleyeceksiniz. Bunu yapabilmek için bir sayaç kullanacaksınız, her gelen veriden sonra sayac'ın değerini 1 artıracaksınız.
Eğer gelen veri, 13(enter) ise artık veriler tamamlanmış demektir, sayac'ı sıfırlayacaksınız ki bir daha kullanabilesiniz. Verileri işleyecek olan fonksiyona gönderebilirsiniz.
Verileri ilgili fonksiyon ile işledikten sonra tamponu temizlerseniz iyi edersiniz.
İşin özeti budur.
Tamamdır interrupt yaptım kesme bölümüne yönlendirdim ancak Tampon[100] olayında her gelen karakteri nasıl atıp getch yapacağımı bilmiyorum Yardımcı olabilir misin kısa bir örnekle ?
Teşekkürler
Kesmeye girdiğinde karakteri nasıl okuyacağın, kullandığın mcu'nun register'larına bağlı olarak değişir.
16f877a için bir örnek:
char UART_Read()
{
while(!RCIF); //Waits for Reception to complete
return RCREG; //Returns the 8 bit data
}
detaylar: https://electrosome.com/uart-pic-microcontroller-hi-tech-c/
kesmenin içinde tampon[sayac]=UART_Read();
şeklinde çağırıp karakteri alabilirsiniz.
static void interrupt isim (void)
{
static int c = 0;
if(RCIF)
{
UartBuff[c] = RCREG;
c++;
if(RCREG=='13')
{
RCREG=getch();
c=0;
RCIF=0;
}
}
}
Yapmak istediğim bu işte hani orda 13 enter karakteri ama nasıl yazdıracam nasıl yakalayacam bilemedim :/
(bu arada flagın interruptunu RCIE sini başka bir header de 1 yaptım yani asıl hedefim şuan burdan entere basana kadar karakterleri alıp enterle yollamak
if(RCREG=='13')
yanlış olmuş '13' diye bir karakter olamaz, ascii kodu 13 olan bir karakter olur ancak.
Yani şöyle yapmalısınız:
if(RCREG==13)
veya
if(RCREG==0x0D)