Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: baran123 - 04 Eylül 2017, 13:07:59

Başlık: Bir algoritma sorusu "Hex format düzenleme"
Gönderen: baran123 - 04 Eylül 2017, 13:07:59
STM32 ile SD karttan hex uzantılı dosya okuyorum.
Amacım bu okuduğum dataları yazmaya uygun hale getirme, düzenlemek.
Okuduğum örnek bir satır şu şekilde
:020000040800F2
Şimdi bu koddan şu şekilde ayıklama yapmam lazım.
0x02 0x00 0x00 0x04 0x08 0x00 0xF2
Fakat SD kartı okuyunca buradaki her karakter bana bir byte olarak geldiği için benim okuduğum her iki 4 biti birleştirip 8 bit yapmam gerek.
Bu çok kolay
(A << 4) | B
Şeklinde yaparız. Ben bunu dizi halinde yaptığımda her şey düzgün ama son byte'ı yani 0xF2 yi bir türlü alamıyorum. 0x72 olarak çıkıyor.
Nerede hata yapıyorum ?

void foo(uint8_t line[])
{
uint8_t dataArray[7];

if (line[0] == ':')
{
for (uint8_t i = 0, k = 0; i < 7; i++, k += 2)
{
dataArray[i] = (uint8_t)(line[k + 1] << 4UL) | line[k + 2];
}
}
}

Başlık: Ynt: Bir algoritma sorusu "Hex format düzenleme"
Gönderen: Tagli - 04 Eylül 2017, 13:33:20
ASCII karakterlerini rakama nasıl çeviriyorsun? Kodda göremedim. Belki bununla ilgili bir sorun olabilir. Ayrıca, ASCII tablosunda 0-9 grubu ile A-F grubu birbiri ardına gelmiyor, belki bununla ilgili bir hata yapmışsındır. 0xF2'yi düzgün alamadığını söylemişsin, verdiklerin arasında içinde harf olan sadece o var. Acaba sonda olduğu için mi hatalı geliyor yoksa içinde F olduğu için mi?
Başlık: Ynt: Bir algoritma sorusu "Hex format düzenleme"
Gönderen: baran123 - 04 Eylül 2017, 13:39:06
@Tagli hocam line dizisini fonksiyon içerisinde direk olarak bastırdığımda görüyorum burada problem yok.
Sadece dönüştürünce problem çıkıyor.


Bu arada bu kodu bilgisayarda direk olarak çalıştırdığımda düzgün sonuç alıyorum.

NOT : Ben bilgisayarda denerken 'F' yerine direk olarak 15 yazıyordum çalışması normalmiş :)
Sanırım "sscanf" fonksiyonunu kullanmam gerekiyor dimi hocam ?
Başlık: Ynt: Bir algoritma sorusu "Hex format düzenleme"
Gönderen: baran123 - 04 Eylül 2017, 14:15:24
Evet cevap sscanf fonksiyonuymuş


uint8_t temp;

for (uint8_t i = 0, j = 0; i < 7; i++, j +=2)
{
sscanf(&line[j+1], "%2x", &temp);
dataArray[i] = temp;
}

@Tagli teşekkürler hocam