Uart'tan gelen dizileri nasıl birleştirebilirim?

Başlatan ogy, 26 Ocak 2014, 13:02:43

ogy

Uart'tan 8 adet data geliyor.Başında sabit 'K' harfi var.Bundan sonra 3 adet hex sayı ve CR(13) geliyor.Örnek;K1a4c5fCR

Ben her datayı okuyup birer değişkene alabiliyorum fakat bana '1a' '4c' ve '5f' hex sayıları ve sonra bu sayıları 3 adet değişkene desimal karşılıklarını almam gerekiyor.Bunu nasıl yapabilirim?

Gelen datayı okuduğum kodlar şöyle;

        if(UART1_Data_Ready())
            {
                data[x]=UART1_Read();

                if(data[0]=='K')
                    {
                        x++;
                    }
                if(x==7)
                    {

                        x=0;
                        data[0]=0;

                        s1=data[1];
                        s2=data[2];
                        s3=data[3];
                        s4=data[4];
                        s5=data[5];
                        s6=data[6];
                        s7=data[7];
                    }
            }

LukeSkywalker

Alıntı Yapfakat bana '1a' '4c' ve '5f' hex sayıları ve sonra bu sayıları 3 adet değişkene desimal karşılıklarını almam gerekiyor

Burada tam olarak ne demek istediğinizi anlamamakla birlikte, verdiğiniz örneğe göre size 7 adet değil 5 adet veri geliyor. K,1a,4c,5f,13 olarak toplam 5 byte veri var. Yani siz 7 adet deği 5 adet veri beklemelisiniz uarttan. Bunları değişkene almaksa kolay;
char s1,s2,s3,s4;
if(UART1_Data_Ready())
            {
                data[x]=UART1_Read();

                if(data[0]=='K')
                    {
                        x++;
                    }
                if(x==5)
                    {

                        x=0;
                        data[0]=0;
                        s1=data[1];
                        s2=data[2];
                        s3=data[3];
                        s4=data[4];
                                           
                    }
            }

Bu örnekte zaten kendiniz değişkenlere aktarmışsınız dizi elemanlarını.

z

8 bitlik bir degiskene ne yerlestirirsen o sayi tek anlama gelir.

Ornegin  usarttan gelen  sayi 0x10 olsun.

Ben hex 10 derim.

Sen decimal 16 dersin

Ingiliz sixteen der.

ALMAN sechzehn der.

Kim ne derse desin A+1 = 17 olur.

Eger kodlu sayi gonderiyorsan Ornegin ASCI 0x31 yolluyorsan bu durumda bunun decimal 1 oldugunu bilirsin fakat bunun uzerinde islem yapacaksan oncelikle decimale cevirmen gerekir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ogy

LukeSkywalker hocam bende öyle zannediyordum ama o şekilde gelmiyor datalar.Sizin verdiğiniz kodu uyguladığımda K1a4c şeklinde geliyor.Yani 1a sayısında önce 1'i sonra a'yı gönderiyor.Dolayısıyla 5 değil 8 data almış oluyorum.Sorunu şöyle anlatıyım;

Bir cihazdan 00 ile 64 hex arası 3 adet bilgi geliyor.Formatıda şu, "K1a4c5f"

1. sensörde değişiklik olduğunda '1a' kısmı, 2. sensörde değişiklik olduğunda '4c' kısmı,3. sensörde değişikli olduğunda ise '5f' kısmı değişiyor.Fakat bu bilgi bana 'K' , '1', 'a', '4', 'c', '5', 'f', '13' şeklinde geliyor.Benim bu bilgiyi yorumlarken 'K', '1a', '4c', '5f' şekline getirmem lazım.Umarım sorunumu anlatabildim.

Ali_54

#4
Alıntı yapılan: ogy - 26 Ocak 2014, 15:12:39
.Fakat bu bilgi bana 'K' , '1', 'a', '4', 'c', '5', 'f', '13' şeklinde geliyor.

K1a4c5f  gönderirken

K + CR
1 + CR
a + CR
4 + CR
C + CR
5 + CR
F + CR

farkında olmadan bu şekilde gönderiyor olabilirsin. Çünkü bildiğin üzere karşı cihaz dönüş için carriage Return yani Ascii 13 ü bekler

mesaj birleştirme:: 27 Ocak 2014, 05:30:14

sen Nasıl gönderiğini yazsan aslında daha iyi olur
1 harf öğretenin 4 gün kölesi olurum.

ogy

Ali_54 hocam bu datayı ben göndermiyorum.Başka bir cihazdan K1a4c5f+CR şeklinde bana geliyor.

z

Her bir ASCI datayi hexe cevireceksin.   Mesela 'A' yi 0xA yapacaksin

Daha sonra da birinci datayi 4 kere sola kaydirip ikinci gelenle orlayacaksin.

Bu islemi her cift icin tekrarlayacaksin.


Not: '0'......'9'  ASCI datalarindan 0x30 cikartirsan hex degerini bulursun

'A'....'F' ASCI datalarindan 0x37 cikartirsan hex degerini bulursun.

Bunlarin disindaki datalar hex değil dersin. Hata olup olmadigini da yakalarsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

LukeSkywalker

Alıntı yapılan: ogy - 26 Ocak 2014, 15:12:39
LukeSkywalker hocam bende öyle zannediyordum ama o şekilde gelmiyor datalar.Sizin verdiğiniz kodu uyguladığımda K1a4c şeklinde geliyor.Yani 1a sayısında önce 1'i sonra a'yı gönderiyor.Dolayısıyla 5 değil 8 data almış oluyorum.Sorunu şöyle anlatıyım;

Bir cihazdan 00 ile 64 hex arası 3 adet bilgi geliyor.Formatıda şu, "K1a4c5f"

1. sensörde değişiklik olduğunda '1a' kısmı, 2. sensörde değişiklik olduğunda '4c' kısmı,3. sensörde değişikli olduğunda ise '5f' kısmı değişiyor.Fakat bu bilgi bana 'K' , '1', 'a', '4', 'c', '5', 'f', '13' şeklinde geliyor.Benim bu bilgiyi yorumlarken 'K', '1a', '4c', '5f' şekline getirmem lazım.Umarım sorunumu anlatabildim.

Sizin şuradaki ifadenize dayanarak ben öyle söyledim;
Alıntı Yap.Başında sabit 'K' harfi var.Bundan sonra 3 adet hex sayı ve CR(13) geliyor.Örnek;K1a4c5fCR
Bu ifadenizde sanki 1a,4c ve 5f şeklinde 3 hex kodun geldiğini söylemişsiniz.
Sizin yapacağınız iş basit o halde.
şu şekilde halledebilirsiniz;
if(UART1_Data_Ready())
            {
                data[x]=UART1_Read();

                if(data[0]=='K')
                    {
                        x++;
                    }
                if(x==7)
                    {

                        x=0;
                        data[0]=0;
                        s1=(data[1]<<4)+data[2];
                        s2=(data[3]<<4)+data[4];
                        s4=(data[5]<<4)+data[6];                        
                    }
            }


m.yalvac

#8
LukeSkywalker Hocam size teşekkür ederim. Bloğunuz gerçekten çok faydalı..