Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

rs232 haberleşme

Başlatan onertan, 17 Mart 2021, 16:19:56

onertan

Merhaba Arkadaşlar.
Bir hdmi switcher cihazını rs232 portundankontrol etmek istiyorum.
Kod göndermede sıkıntı yok ama geri bildirim alamıyorum birtürlü. Örneğin 4. girişi 1. çıkışa gönder dediğim zaman (SET SW in4 out1\x0D\x0A) bunu cihaza yaptırabiliyorum. Ama buna karşılık cihazdan (SWin4 out1<CR><LF>) kodu gelmesi lazım. Bu kod gelmesine geliyor ama benim devrem bunu alamıyor çünkü kitleniyor. RDA kesmesini iptal ettiğim zaman kodu göndermede sorun yaşamıyorum ama geribildirim almak için RDA kesmesini aktif etmem lazım ve ozaman da devre kitleniyor.
Bilgiyi karakter karakter alıyorum ama çözümü bulamadım.



#include <16f877A.h> // kütüphaneyi tanıtıyoruz
#use delay(clock=20M)
#fuses HS, NOWDT, NOPUT, NOLVP, NOCPD, NOPROTECT, NODEBUG, NOBROWNOUT, NOWRT
#include <string.h>
#include <stdlib.h>


#use rs232 (baud=115200, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, errors, long_data)

#define VERI_IZNI pin_c5
#define VERI_ALMA_LEDI pin_c1
   



char i;
int t, d, textsize;

char gelen[20];



#int_rda
void rs232_kesmesi()
{  
   for(t=0; t<10; t++)
   {
      gelen[t] = getch();
   }
   
   disable_interrupts(int_rda);

}         


void main()
{       
   set_tris_b(0xFF);
   set_tris_c(0x00); 
   delay_ms(50);
 
   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin verir
//   enable_interrupts(int_rda); // int_rda kesmesi aktif  

   
   
   while(1) 
   {
       
      if(input(pin_b2) == 1)
      {
         printf("SET SW in3 out1\x0D\x0A");         // Cihaza SET SW in3 out1<CR><LF>  kodu gönderiyorum ve alıyor
         delay_ms(50);
         enable_interrupts(int_rda);
         delay_ms(3);
         output_high(pin_c2);
         delay_ms(100);
         output_low(pin_c2);
         delay_ms(20); 
         disable_interrupts(int_rda);
         delay_ms(3);
      }
      if(input(pin_b1) == 1)
      {
         printf("SET SW in4 out1\x0D\x0A");       // Cihaza SET SW in4 out1<CR><LF>  kodu gönderiyorum ve alıyor
         delay_ms(50);
         enable_interrupts(int_rda);
         delay_ms(3);
         output_high(pin_c1);
         delay_ms(100);
         output_low(pin_c1);
         delay_ms(20); 
         disable_interrupts(int_rda);
         delay_ms(3);
      }
      delay_ms(500);

      if(gelen[5] == "4")                // Cihazdan SWin4 out1<CR><LF>  kodu gelmesi lazım ve beşinci karakteri sorguluyorum
      {
         output_high(pin_c0);   //geribildirim gelirse ledi yak
         delay_ms(500);
         output_low(pin_c0);  
      }
      

   }         
}

onertan

Merhaba arkadaşlar fikri olan var mı?

ziyaretci

#2
Gelen karakterlerin bazılarının ASCII karşılıkları iki haneli olabiliyor. Sizde bu ASCII karşılığına göre kontrol sağlıyorsanız, hiç olmayan karakteri arıyor olabilir ya da tamam gelen geldi işim bitti deyip bufferda bilgi bırakıyor olabilirsiniz. Bu durumda program kesmede kalıp kilitlenir.

Kastım;

ASCII okunan: SWin4 out1<CR><LF>  -->> 18 karakter gibi
Normalde gelen: 12 karakter vs.

Ya da

ASCII okunan: SWin4 out1<CR><LF>
Normalde gelen: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n  18+1 karakter.

Öneri:
Cihazın gönderdiği bilgileri okuduğunuz arayüzde, .hex gösterimini açıp, gelen verileri tam manasıyla görmeniz sorunu size tam olarak söyleyecektir.

z

Bugibi durumlarda terminal programi kullanip gelen datalarini gorsellestirmelisiniz.

Siz kendi MCUnuzla ne gonderecekseniz gonderin. Gelenleri terminal programi ekranda gostersin
hatayi daha kolay yakalarsiniz.

Gelen datalari terminal programi isterseniz hex olarak da gosterebilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

disable_interrupts(int_rda);

satirini silin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

onertan

Teşekkür ederim arkadaşlar. Önerilerinizi deneyip bilgi vereceğim.