Uart haberleşme hakkında yardım

Başlatan Yusuf_35, 10 Eylül 2015, 20:40:13

Yusuf_35

Arkadaşlar selamün aleyküm. Mikro c öğreniyorum ve bu konuda yeniyim. C# ile bir program yazıyorum. Programdan seri porta string veri gönderiyorum. Mikro c  arayüzünü kullanarak bu gelen veriyi Proteusta Pic16f877A kullanarak tasarladığım devrede LCD ekranda göstermek istiyorum ama bunu yapamadım. Gelen veriyi char türünde almak zorunda kalıyorum ve string türünde alamıyorum. Yardımcı olursanız sevinirim. Şimdiden teşekkür ederim.programın kodu şu şekilde ;

       sbit LCD_RS at RB0_bit;
       sbit LCD_EN at RB1_bit;
       sbit LCD_D4 at RB2_bit;
       sbit LCD_D5 at RB3_bit;
       sbit LCD_D6 at RB4_bit;
       sbit LCD_D7 at RB5_bit;
       sbit LCD_RS_Direction at TRISB0_bit;
       sbit LCD_EN_Direction at TRISB1_bit;
       sbit LCD_D4_Direction at TRISB2_bit;
       sbit LCD_D5_Direction at TRISB3_bit;
       sbit LCD_D6_Direction at TRISB4_bit;
       sbit LCD_D7_Direction at TRISB5_bit;

void main() {
char c;
LCD_INIT();
LCD_CMD(_LCD_CURSOR_OFF);
LCD_CMD(_LCD_CLEAR);
UART1_Init(9600);
while(1)
{
if (UART1_Data_Ready())
{
c = UART1_Read();
LCD_CMD(_LCD_CLEAR);
LCD_OUT(1,1,"Hosgeldin");
LCD_OUT(2,1,c);
}
}
}

Mesela bu kod çalıştığında benim istediğim LCD de Hoşgeldin Yusuf  yada gönderdiğim başka stringin yazması.

RaMu

#1
En kaba haliyle:
PC den gönderdiğin verinin ilk ve son karakteri belli olsun,
arayada göndermek istediğin bilgiyi yaz, misal
* başlangıç karakteri olsun
# sonlandırma karakteri,
*Hosgeldin Yusuf# şeklinde PC den gönder;

Pic programında ise,
sürekli uarttan gelen veriyi dinle,
eğer * karakteri gelirse, gelen karakterler kaydet, taki
# karakteri gelene kadar:
-Mikroc de net olarak neleri kullanman gerekiyor bilmiyorum ama tahmini şöyledir-
while( data_okey == 0)
{
     while  (  ! UART1_Data_Ready()  );  //uarttan data gelene kadar bekle
       if (  UART1_Read() == '*' )            //uarttan gelen data başlangıç karakteri ise
      {
       i=0;
          while (gelen_data[i] != '#')            //ve sonlandırma karakteri değilse
          {
           while  (  ! UART1_Data_Ready()  ); //uarttan data gelene kadar bekle
           gelen_data[i] = UART1_Read();      //gelen datayı kaydet, (iki üst satırda 
                                                //sonlandırma karakteri mi gelmiş diye kontrol ediyoruz)
           i++;
           }
           data_okey = 1; //sonlandırma karakteri geldi
      }
}

LCD_OUT(1,1,"%s" gelen_data);
data_okey=0;


Sonra bu aldığın diziyi lcd ekrana basacaksın,
LCD_OUT(1,1,"%s" gelen_data);
kısmından emin değilim,
mikrocde string yazdırma nasıl bilmiyorum.

mesaj birleştirme:: 10 Eylül 2015, 22:22:07

Yazdığım kodda ufak bir hata gördüm,
sonra düzeltirim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Yusuf_35

Hocam cevap için teşekkür ederim. Yanlız kodu derleyip proteusta calıştırdıgımda stack overflow hatası alıyorum. Lcd de görüntüleme olmuyor.

RaMu

MikroC pek kullanmadım,
kodu algoritma örneği olsun diye yazdım,
mikroc için düzenlenmesi gerekebilir.
MikroC de iyi olan hocalar yardımcı olacaklardır.

Yukarıdaki örneğin
while (gelen_data[i] != '#')            //ve sonlandırma karakteri değilse

satırı zaten hatalı.
Birde MikroC de LCD ye string yazdırma diye araştırıp,
o kısmı doğrulamak lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Yusuf_35

Hocam ben o kısımları doğruladım ama tam doğrulayamamış olabilirim. Bu mikroc de uart_read_text die bir komut var onun kullanımını araştırdım belki bu komut işe yarar. Sitelerde çeşitli anlatımlar var ama ingilizce olduğu için pek bir sonuca ulaşamadım. Aslında kolay bir konudur muhtemelen ama seri haberleşme konusunda pek bilgili olmadığım için burada tıkandım kaldım. ALLAH razı olsun yardımınız için, diğer arkadaşlarda konuyu görünce yardımcı olurlar umarım.

jrcapa

Merhaba.
Aşağıdaki kod parçacığını deneyebilirsiniz. "@" karakteri gelene kadar 10 karakterli string diziye kaydedilir.


char yazi[10];

if (UART1_Data_Ready())
{

UART1_Read_Text(yazi,"@",10);
Lcd_Out(1, 3, yazi);

}


Ayrıca Mikro C derleyicisinin "Help\Hardware Libraries" kısmına bakınız.


Yusuf_35

Hocam ALLAH razı olsun.Yazdığınız kodu denedim. C# dan yusuf@ verisini yolluyorum LCD de yusuf yazısı çıkıyor. Dediğiniz kod tam aradığım kod, sorunumu çözdü.Çok teşekkür ederim.