Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Mikroc uart sıkıntıları

Başlatan EMG81, 25 Ekim 2012, 04:32:06

EMG81

Merhaba,

Geçen sene mikroc kullanırken tamamladığım bir proje üzerinde restorasyonlar yapmam gerekli. Uzun süredir mikroc yi kullanmıyordum. Menülerini bile unutmaya başlamışım..
Sorun şu;

Uarttan "%" karakteri ile başlayan ve ardından 300-350 kadar devam eden bir paket veri alıyorum. Ben "%" karakteri ve sonraki 200 karakter ile ilgileniyorum. Gerisi benim için önemli değil. Mikroc help inden kurcaladığım kadarı ile,
if (UART1_Data_Ready()) 
{

}


altında i,j,k gibi bir array i arttırıp UART1_Read(); fonksiyonu ile de okuyoruz.
Örneğin,
Test=UartVeri[0];
if(Test== '%' && M==11) M=0; M++;
UartVeri[M] = UART1_Read();


ile 10 byte bilgiyi alabiliyorum.

Test=UartVeri[0];
if(Test== '%' && M==201) M=0; M++;
UartVeri[M] = UART1_Read();


bunun ilede 200..
200 karakterden sonra ne kadar daha byte geldiğini bilmiyorum ve dediğim gibi bununla ilgilenmiyorum.

Nette ki örnekler hep yukarıda anlattığım gibi yazılmış. Bunlar ile gelen paket uzunluğunu bildiğimiz sürece çalışabiliriz. Ancak ben dediğim gibi "%" karakterinden sonraki 200 karakter ile ilgilenip diğerleri ile ilgilenmemek istiyorum..

Elinde bu tarz örneği olan varmı?

LukeSkywalker

Hocam önce % karakterini ayrica komtrol edip eger o karakter geldiyse ardindan gelenleri dizi icerisine alin.

EMG81

#2
Şöyle,

Test = Uart[0]; şeklinde test i gelen ilk byte ile eziyorum. Uart[0] ın '%' olduğunu kontrol ediyorum. Sonra ne alacaksak alıyorum(500 byte buffer tanımladım). Sonra da for döngüsü ile bufferdan ilk 200 ünü çekiyorum.

Sorun şu.

Gelen datanın uzunluğunu bilmediğimizden(300-400-456-476 vs ne ise) M değişkenini ne zaman 0 lamamız gerektiğini anlayamıyoruz. Şöyleki ilk 200 geldikten sonra 100msn kadar uartı kapatabilsem veya X byte kadar veri alıyor olalım. X byte ın bitişini anlayabilsem M yi sıfırlarım ve sorun ortadan kalkar. Ama biz mesela M yi 200 de sıfırlayıp 250 byte veri alıyorsak M 200 de sıfırlanıyor ve artan 50 byte ı ilk 200 ün üzerine yazıyor ve böylece hem '%' bilgisi kayboluyor hemde ilk 49 byte bozulmuş oluyor.

Sabah işlemciye bir oyun oynayıp onu kandırmıştım ve sorun ortadan kalkmış gibiydi. ilk 200 ü çekebiliyordum. Ama 15-20 dk lık bir çalışmadan sonra işlemci takılıyor. Pek sağlıklı bir yöntem olmadı. (Yani yine 200 den sonra artan veri sayısını bilmediğimizden 10-15 dk da 1-2 veri kaçırıyor ve işlemci uart rutininde sıkışıp kalıyor.)

En sağlıklısı ilk 200 den sonra uartı kapatabilmek, beklemek, devamını kabul etmemek vs. Mikroc de bu nasıl yapılıyor anlamadım.

Klein

200. veriden sonraki veriler içerisinde '%' karakteri olma ihtimali var mı?
Eğer yoksa  M'yi  % karakterini gördüğünde sıfırla. sayacın 200 den küçükse veriyi al. aksi durumda alma.

EMG81

Aynen. Sabah bende böyle kandırdım işlemciyi ama 200 den sonrasında da % karakteri gelebiliyor.

Klein

iki paket arasında boşluk varsa timeout olup olmadığına bakabilirsin.  eğer bu sürede veri gelmemişse  M'yi sıfırlayıp '%' karakterini beklersin.