TI lx4f120 UART Stream Problemi

Başlatan muhendisbey, 24 Ağustos 2014, 14:59:13

muhendisbey

Merhaba, bir sorun ile karşılaştım ancak çözümüm yok.
Daha önce karakter kullanarak UART üzerinden interrupt oluşturabiliyordum, ancak işin içine stream girince ortalık karıştı kullanamıyorum. En son Ardunoda Serial.findUntil ve Serial.parseInt kullanarak yapabildim. Bu komut yapılarını ARM'de nasıl oluşturabilirim?
STM32 veya bir başka seri için de yazsanız kabulümdür.

Arduinodaki kısım aşağıdaki gibi
.
.
.
.
  if (Serial.available()) {
    while(Serial.findUntil("hash", "\n\r")){ 
    while(Serial.available() == 0) ;   
    char type = Serial.read(); 
    int val = Serial.parseInt();
        if( type == '$') {   
.
.
.


iyi çalışmalar
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

Bir "Saçmalatmaca" metoduyla kendi ring bufferımı yazmış oldum. Bu kadar iç içe if döngüsü adama kalp krizi geçirtebilir kanısındayım ring buffer oldu mu ondan bile emin değilim. Ama sistem çalışıyor :)
En son bu kadar döngüyü ASM'de bekleme komutu için yazdım 5 sene önce.
for(s=0;s<=3;s++){
		if(temp[s]=='r'){s=s++; if (s==6){s=0;GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);};
			if( temp[s]=='e'){s=s++; if (s==6){s=0;};
				if(temp[s]=='d'){
					GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
					s=3;
					break;
					}
			}
		}			
		}
		
		for(s=0;s<=3;s++){
		if(temp[s]=='b'){s=s++; if (s==6){s=0;};
			if( temp[s]=='l'){s=s++; if (s==6){s=0;};
				if(temp[s]=='u'){s=s++; if (s==6){s=0;};
					if(temp[s]=='e'){
					GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
					s=3;
					break;
					}
			}
		}
	}
}
		
		if(temp[n]=='\n'){n=0;
		UARTIntClear(UART0_BASE, ulStatus);  }
                n=n++;
		if (n==6){n=0;}


Bu kodu başka nasıl yazabilirim. Her harf için bir döngü yazmak çok saçma geliyor.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

Bu işe çözümü olan yok mu? Burada olması gereken nedir forumda bilen mi yok, yoksa cevap vermek istemeyen mi çok?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

moderatör arkadaş konuyu silebilir.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

kimlenbu

Keşke soru sorduğumuz gibi cevap gelse ama herkesin işi gücü olduğundan fırsat bulunca cevap veriliyor.

İlk önce veriler "stream" olarak geliyor demişsiniz, bu veri içinden "blue" kelimesini mi yakalamanız gerekiyor ? veriden sonra \r \n geliyor mu ? Eğer geliyorsa işiniz kolay, \r ve \n hariç bütün karakterleri buffer'a atın, \n görünce

!strcmp(temp,"blue")


şeklinde kontrol edin.

iç içe if kullanmak istemiyorsanız da tek satırda

if(temp[s]=='b' && temp[s+1]=='l' && temp[s+2]=='u' && temp[s+3]=='e')
şeklinde kontrol edebilirsiniz.

muhendisbey

Öncelikle cevabınız için çok teşekkür ederim.

Evet bir sinyal üzerinden blue kelimesi gibi birçok kelimeyi süzmek istiyorum.
\r\n verisinin tercihen gelmemesini istiyorum ancak zor görünüyor. O nedenle \r\n de kabulüm.

if döngüsünü aşağıda yaptığınız gibi yaptığımda hata almıştım, o nedenle parçalamıştım.
Keil'de son s+3 altını çizerek bir hata almıştım şu an hata neydi hatırlamıyorum ama onu denemiştim.

Yapılmak istenen tam olarak şu blue verisinden sonra gelen integer değeri okuyup PWM parametresi olarak belirlemek.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

CLR

Karşı tarafı/göndereni sen mi yazdın yoksa hazır mı? Sen yazdıysan neden string gönderiyorsun?
Knowledge and Experience are Power

yldzelektronik

#7
Alıntı yapılan: muhendisbey - 26 Ağustos 2014, 15:07:23
Öncelikle cevabınız için çok teşekkür ederim.

Evet bir sinyal üzerinden blue kelimesi gibi birçok kelimeyi süzmek istiyorum.
\r\n verisinin tercihen gelmemesini istiyorum ancak zor görünüyor. O nedenle \r\n de kabulüm.

if döngüsünü aşağıda yaptığınız gibi yaptığımda hata almıştım, o nedenle parçalamıştım.
Keil'de son s+3 altını çizerek bir hata almıştım şu an hata neydi hatırlamıyorum ama onu denemiştim.

Yapılmak istenen tam olarak şu blue verisinden sonra gelen integer değeri okuyup PWM parametresi olarak belirlemek.


gelen bütün veriyi buffera çek. İçinden "blue" stringi ara (adres = strstr("blue",gelen_veri_bufferi); ) O adrese 1 ekle (hemen peşine gelen veri o ise) hazır atio kullanacaksan kaç karakter ise gelen veriyi char diziye çek ve atoiye adresiyle gönder.Kendi atoi ni yazacaksan kaç byte karakter int ise ona göre hesapla.

Bilmem işini görür mü..

Ekleme:strstr bulduğu yerdeki başlangıç adresini de verebilir.Emin değilim.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

muhendisbey

Karşı gönderi kısmını da C# da ben yazıyorum.

Array bir buffer mıdır? Yoksa buffer bunlardan daha mı farklı?, nasıl oluşturulur?
İnternette araştırırken bir bufferın şöyle yapıldığını gördüm doğru mudur?
Alıntı Yap#define MY_BUFFER_SIZE 1024

char mybuffer[MY_BUFFER_SIZE];
int nBytes = read(sck, mybuffer, MY_BUFFER_SIZE);

Eğer böyleyse arrayden farklı değil.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

yldzelektronik

Alıntı yapılan: muhendisbey - 26 Ağustos 2014, 18:18:05
Karşı gönderi kısmını da C# da ben yazıyorum.

Array bir buffer mıdır? Yoksa buffer bunlardan daha mı farklı?, nasıl oluşturulur?
İnternette araştırırken bir bufferın şöyle yapıldığını gördüm doğru mudur?
Eğer böyleyse arrayden farklı değil.

Evet
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

muhendisbey

#10
yldzelektronik strstr komutunu öğrettiğin için teşekkür ederim. strcmp komutu için de kimlenbu'ya ayrıca teşekkürler. Bir deneyip sonucu bu başlıktan paylaşacağım.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

#11
Kimlenbu

and'li if komutu okumadı. Tahminen nedeni temp içerisine yazılan s+1 işleminin gerçekleşmemiş olması. Hatırlıyorum benim komutta s=s++ koyma sebebim de buydu

strcmp komutunu da array ile kullanamıyorum hata uyarısı aşağıda. pointer yapmayı denedim gene olmadı. Ancak char temp; gibi array olmadığında sıkıntı çıkarmadı. Bu şekilde de çalıştıramayacağım için denemedim.

diğer komutları deniyorum


mesaj birleştirme:: 27 Ağustos 2014, 12:04:58

strstr'de de durum aynı.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

yldzelektronik

@muhendisbey

Kodu versen de baksak?Sakıncası var mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

kimlenbu

#13
sting fonksiyonlarını kullanmak için

#include "string.h"


kodunu eklemen gerekiyor. Ayrıca bunlar hata değil uyarı, array yerine pointer kullanırsan bu uyarılar da gider.

ek : pointer kullanmasan da çalışıyor ama uyarı verir bu şekilde.

CLR

Alıntı yapılan: muhendisbey - 27 Ağustos 2014, 12:03:03
Kimlenbu

and'li if komutu okumadı. Tahminen nedeni temp içerisine yazılan s+1 işleminin gerçekleşmemiş olması. Hatırlıyorum benim komutta s=s++ koyma sebebim de buydu

strcmp komutunu da array ile kullanamıyorum hata uyarısı aşağıda. pointer yapmayı denedim gene olmadı. Ancak char temp; gibi array olmadığında sıkıntı çıkarmadı. Bu şekilde de çalıştıramayacağım için denemedim.

diğer komutları deniyorum


mesaj birleştirme:: Ağustos 27, 2014, 12:04:58

strstr'de de durum aynı.

@muhendisbey

Aşağıdaki linkte string fonksiyonlarının sülalesi ve kullanım örnekleri var.
http://www.cplusplus.com/reference/cstring/

Csharp ile kaçtane renk basacaksın ki? Eğer 256'dan fazla değilse ki, olmaması lazım insan gözü aradaki renkleri algılamaz. 256'dan fazla renk yoksa sana tüm işlemleri için toplam 16bit yetebilirdi. 8bit color index, 8bit pwm index.
Bu indexleri işlemcinin içinde const olarak tutardın olur biterdi. 
256'dan fazla ise değil buffer, frame buffer'ı biliyor olman gerekirdi. 
Knowledge and Experience are Power