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];
}
}
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ı.
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.
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.
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
Ali_54 hocam bu datayı ben göndermiyorum.Başka bir cihazdan K1a4c5f+CR şeklinde bana geliyor.
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.
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];
}
}
LukeSkywalker Hocam size teşekkür ederim. Bloğunuz gerçekten çok faydalı..