İki PIC' in UART haberleşmesi

Başlatan kartal0689, 02 Eylül 2016, 13:59:14

kartal0689

Arkadaşlar Merhaba,

İki picim var. Birisi (MASTER) diğerine birden farklı 16bitlik veri gönderecek.
Burada kafam karışıyor. UART' dan 8 bit olarak veri gönderebiliyoruz.
Diyelim ki 16 bitlik veriyi 8-8bit olarak gönderdim.

Alıcı tarafında bunu nasıl birleştireceğim. Hangisi ilk gelen veri diyeceğim.
Örneğin Verici tarafından;

Temp_Byte : byte; // 8 bit değişken
Veri : word; // 16bit değişken

veri := 1234;
Temp_Byte := lo(Veri); // veri değişkeninin ilk 8 biti
UART1_Write(Temp_Byte);

Temp_Byte := Hi(Veri); // veri değişkeninin son 8 biti
UART1_Write(Temp_Byte);


Alıcı Tarafında ise;
Read_Data : byte; // 8 bit değişken

Read_Data := Uart1_Read();


Burada gelen veriyi nasıl işlemem gerekir.
Kaldı ki bu bir datanın işlenmesi. Bundan farklı birçok 16 bitlik data olacak.

Anlayamadım, yardımcı olabilir misiniz?

Erol YILMAZ

Toplam boyutu 2 tane char (8 bit) olan bir paket gönderirken 8 bitlik verileri boşluksuz gönderiyorsun.

Verici tarafında paketler arasında min 3 char boşluk bırakıp gönderirsin.
Alıcı tarafında 2 char boşluk görünce paket alımı reset olur.

Bu şekilde hangisi başı hangisi sonu anlamış olursun.

Karışık oldu, birkaç defa okuman lazım :)

EMP_Otto

İlk gönderdiğin Low Byte İkincisi High Byte olmak üzere;
LowByte=Uart1_Read();
HighByte=Uart1_Read();
Okunan deger=HighByte<<8|LowByte;    olur

Hangi deger Lowbyte hangisi HighByte karısmaması içinde  bir yöntem düşünmen lazım
Bu işler zordur,özveri ister...

kartal0689

Alıntı yapılan: Allegro - 02 Eylül 2016, 14:18:03
Toplam boyutu 2 tane char (8 bit) olan bir paket gönderirken 8 bitlik verileri boşluksuz gönderiyorsun.

Verici tarafında paketler arasında min 3 char boşluk bırakıp gönderirsin.
Alıcı tarafında 2 char boşluk görünce paket alımı reset olur.

Bu şekilde hangisi başı hangisi sonu anlamış olursun.

Karışık oldu, birkaç defa okuman lazım :)

Verici tarafı

Temp_Byte : byte; // 8 bit değişken
Veri : word; // 16bit değişken

veri := 1234;
Temp_Byte := lo(Veri); // veri değişkeninin ilk 8 biti
UART1_Write(Temp_Byte);

Uart1_Write(0x00);
Uart1_Write(0x00);
Uart1_Write(0x00);

Temp_Byte := Hi(Veri); // veri değişkeninin son 8 biti
UART1_Write(Temp_Byte);
Uart1_Write(0x00);
Uart1_Write(0x00);


bu şekilde mi?

Erol YILMAZ


kartal0689

Alıntı yapılan: Allegro - 02 Eylül 2016, 15:36:32
Çizmeye çalıştım...

(Resim gizlendi görmek için tıklayın.)

Diyelim ki data paketini göndermeye başladım. Alıcı da almaya başladı.
herhangi bir sebepten dolayı verici yada alıcı sonra devreye girdi.
Yani verici 1. paketi gönderirken alıcı 2. yi beklemeye başladı.
burada kafam karışıyor. hangi paketin geldiğini nasıl anlayacak?

Veriyi göndermeden önce hangi paket olduğunu belirten başka bir data mı göndermeliyim?
örnek 0x0A yı gönderecem ve diyecem ki bundan sonra gelen paket 1. datanın bu nu mu diyeceğim.

Daha önce hiç ilgilenmediğim bir konu kusura bakmayın belki çok basit bir yerde takılıyorumdur

Erol YILMAZ

Alıcı taraf paket başı için 2 char TIMEOUT'u bekleyecek.
Verici taraf 3 char boşlukla gönderecek.

Böylece alıcı her zaman paket başını algılayabilecek diye düşünüyorum.

okg

#7
paket başına ve sonuna data paketi içerisinde olmayan bir header ve tail bitleri ekleyip karşı tarafta bunları sorgulatarak arada kalanları alabilirsin,bu sayede alıcı vericinin ne zaman devreye girdiğinin bi önemi kalmayacak

Örnek olması açısından şu şekilde bir düzenleme yapabilirsin;




sprintf(buf,"#:%d:%d:%d\n", data1, data2, data3);
USART_Puts(USART2,buf);





karşı tarafta ise, paket "#" ile başlıyor ise " : " karakterinden sonra bölerek gelen1 gelen2 gelen3 şeklinde ayırabilirsin
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL