Değişken boyutlu string içinden byte alma?

Başlatan Veli B., 27 Ağustos 2013, 11:00:10

Veli B.

Keil ve LPC11C24 ile UART üzerinden 115K ile 41/42/43 bytelık stringler alıyorum.
String headerları değişken boyutlarda;
41byte olan  C....
42 byte olan B....
43 byte olan H.... ile başlıyor.

Bu stringlerin içinden, headera göre 11. veya 14 ve17.  veya 21 22 23 bytelara göre işlem yapmam gerekiyor.

Data kaçırmadan en hızlı şekilde nasıl yakalayıp, ilgili byteları alabilirim?

Veli B.

Yok Hocam,
paket tanımlayıcı olarak unique ID şeklinde kullanılmış ve paket içinde bir daha geçmiyor.

Örnek verme imkanınız var mı?
Çok makbule geçer Hocam.

kimlenbu

Data kaçırmamak için yanlış hesaplamadıysam yaklaşık olarak her byte arasında 72 mikro saniye kadar süren var. Oldukça verimli bir kontrol yazman gerekiyor. Ya da baud rate'i düşüreceksin.

Veli B.

Baudrate ayarı benim elimde değil. 3. parti bir cihazdan data alıyorum. Bu sebeple "en hızlı ve hatasız ne şekilde yaparım" ı araştırıyorum.

cicjoe

#4
Hocam ben olsam islemi her byte geldiginde tek tek yapardim.. Yani bir loop ile donup header bulduktan sonra ilgili data'ya gitmezdim.. Boylece her 2 veri arasinda yapilarak islem kisa surede bitirilebilir gibi geldi, hem de asil ilgilendigim veri henuz ulasmamissa sorunu da ortadan kalkar gibi dusundum.. Soyle ornekleyim, tam kod değil ama, ayakustu yazdim fikir vermesi acisindan..

int current=0, pos=0;
void onDataReceived(char receivedChar) //uart kesmesi olmali burasi..
{
	switch (receivedChar)
	{
		case 'C': pos = 11; current = 0; break;
		case 'B': pos = 14; current = 0; break;
		....
		default:
			current++;

			if (current == pos)
				datayi almaca
			....
	}
}


Boylece n adet char geldikten sonra O(n) calisma zamani harcamak yerine, her char geldiginde O(1) calisma zamani elde edilebilir..

z

Ortada bir sorun goremedim.

Data geldikce okuyup array icine sirayla atsan sonrada iclerinden cekmek istediklerini ceksen olmuyormu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Şöyle bir önerim olabilir.
3 farklı işlem ayrı fonksiyon yazarsınız.
bir de fonksiyon işaretçisi tanımlarsınız.
Header'i aldıktan sonra  içeriğe göre  hangi fonksiyonu işletecekseniz, fonksiyon işaretçisine o fonksiyonun adresini atarsınız.

ErsinErce

#7
yukarıdaki programda C ve ya B nin string içinde tekrarlanması işi bozar paketler arası boşluklara bakılarak paket sonu belli edilmeli
STM32 de IDLE biti bu işi kolayca yaptırıyor ama lpc de nasıl olur bilmiyorum
en olmadı timeout tarzı bir yapıyla x ms veri gelmezse paket sonu diyerek buffer incelenebilir.


----------------------------------------------------

tam okumadan atlayınca böyle oluyor :) meğer CBH tekrarlanmıyormuş
neyse ekstra çözüm olarak yine de dursun

Klein

Alıntı yapılan: ErsinErce - 27 Ağustos 2013, 18:33:08
STM32 de IDLE biti bu işi kolayca yaptırıyor ama lpc de nasıl olur bilmiyorum
Uzun zamandır STM'nin IDLE yapısını incelemek istiyorum. Ama bir türlü zaman bulamadım. Konuya vakıfsan , başka bir başlıkta bundan biraz bahsedebilir misin?

ErsinErce

Alıntı yapılan: Klein - 27 Ağustos 2013, 20:15:57
Uzun zamandır STM'nin IDLE yapısını incelemek istiyorum. Ama bir türlü zaman bulamadım. Konuya vakıfsan , başka bir başlıkta bundan biraz bahsedebilir misin?
buyrun hocam
https://www.picproje.org/index.php/topic,48469.msg361931.html