Mesafe Sensörü verisini aktarma

Başlatan robikod, 17 Haziran 2016, 16:48:45

robikod

Mesafe bilgisini seri port üzerinden almaya çalışıyorum.
Arduino tarafındaki kodlar:
void mesafe()
{
digitalWrite(trigger_pin,HIGH);
delayMicroseconds(100);
digitalWrite(trigger_pin,LOW);
zaman=pulseIn(echo_pin,HIGH);
uzaklik=(zaman/2)/29.1;
Serial.print(uzaklik);

  
}


C tarafındaki kodlar:

int mesafe=0;

		ReadFile(hComm,&mesafe,1,NULL,NULL);
printf("Su an engelden %d cm uzakliktasiniz \n ",mesafe);
if(mesafe<=4)
{
	printf("dikkat!\n");
}



Mesafe bilgisini bu şekilde C ekranına göndermeye çalışırken, rastgele sayılar üretiliyor bu sorunu nasıl çözebilirim ?

robikod

Ödevimi teslim etmem gerekiyor bu konuda yardımcı olacak var mı ?

mehmet

"uzaklik" değişkeni float anladığım kadarıyla; bu değişken
içeriğini hane hane parçalayıp ASCII olarak yollarsınız. Alıcı
kısımda da uygun şekilde birleştirirsiniz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

robikod

Alıntı yapılan: mehmet - 17 Haziran 2016, 23:22:39
"uzaklik" değişkeni float anladığım kadarıyla; bu değişken
içeriğini hane hane parçalayıp ASCII olarak yollarsınız. Alıcı
kısımda da uygun şekilde birleştirirsiniz...
uzaklik degişkeni int olarak tanımlandı.
Hane hane nasıl parçalayacağım ?

mg1980

#4
Probleminizi tam anlamadım ama ben size çalışan bir kod vereyim belki işinize yarar:Bu kod ekleme işini bir türlü beceremedim.Kusura bakmayın.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);// 7=RS,6=E,5=D4,4=D5,3=D6,2=D7

int trigPin=8;
int echoPin=9;


void setup() {
  lcd.begin(16,2);
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
 

}

void loop() {
  int sure,mesafe;
  digitalWrite(trigPin,LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin,LOW);
  sure=pulseIn(echoPin,HIGH);
  mesafe=(sure/2)/29.1;
  if (mesafe>=200||mesafe<=0)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Menzil Disi");
  }
  else
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("MESAFE=");
    lcd.print(mesafe);
    lcd.print(" cm");
   
  }
  delay(1000);
}

robikod

Sorun zaten ardino üzerindeki kodlarda değil.
Sorun C tarafından o kodları C ye çekmekte.
Bu konuda bilgisi olan yazarsa sevinirim

mg1980

C ekranı nedir bilmiyorum doğrusu.Ben LCD'ye yazdırıyorum. C ekranına yazdırınca ne olacak?

robikod

Sonuçları DevC de yazdığın kodlarla DevC nim siyah ekranında görüyorsun.  Seri haberleşmeyi kullanarak. 
Benim yapmak istediğim sonuçları arduinodan seri port üzerinden devc ye aktarmak

robikod


Klein

Mesafe değişkenine sabit değerler ver. Eğer saçma değerler görmüyorsan, printf(...) kısmında sorun yoktur. Zaten orada sorun olduğunu da zannetmem.
O zaman sorun ya readfile() fonksiyonunda, ya da readfile ile okuduğun veri sürekli değişiyor.
Bu durumda öncelikle  arduino tarafından gelen verileri  bir terminal programı ile izlemeni öneririm. eğer terminalde gördüğün veri stabil ise, o zaman readfile fonksionuna yönelebilirsin.

robikod

peki read file yerine önerebileceğiniz bir yapı var mı ?

Klein

Readfile yerine başka bir önerim yok.  Aslında readfile() fonksiyonunu kullanmayalı uzun zaman oldu.  Parametrelerini tam hatırlayamadım.
Tampon uzunluğu için 1 vermişsiniz. Hatırladığım kadarıyla o parametre byte cinsinden uzunluk. siz veriyi word olarak gönderdiğinizi söylemiştiniz.

robikod

#12
Alıntı yapılan: Klein - 18 Haziran 2016, 21:45:35
Readfile yerine başka bir önerim yok.  Aslında readfile() fonksiyonunu kullanmayalı uzun zaman oldu.  Parametrelerini tam hatırlayamadım.
Tampon uzunluğu için 1 vermişsiniz. Hatırladığım kadarıyla o parametre byte cinsinden uzunluk. siz veriyi word olarak gönderdiğinizi söylemiştiniz.

veri int değişkenine bağlı uzaklik ile gönderiliyor. byte değeri göndermediğim için böyle bir sonuç vermiş olabilir mi ?

status = ReadFile(hComm, &test, 1, &transmitCheck, NULL); böyle bir kullanımı var internetten araştırdığım kadarıyla

Klein

Muhtemelen öyle.
ReadFile(hComm, &test, 1, &transmitCheck, NULL);
Buradaki 1  tampon uzunluğu.
Eğer seri porttan gelen değer 2 byte ise   1 olan parametreyi 2 yapman gerek. 
Göndericin veriyi Little Endian mı Big Endian mı göndriyor?  PC tarafı nasıl alıyor? Gönderdiğin veri kaç byte?
Bunları bilmeden soruna kesin cevap vermek zor.
Uzunluk parametresini 1,2 ve 4 olarak değiştirip br dene.
Ama deneme yanılmadan daha da iyisi seri portu dinleyen bir analiz programı ile gelen veriyi görmek. Gelen verinin ne olduğu bilinirse, alma kısmı daha rahat çözülür.

robikod

#14
Alıntı yapılan: Klein - 19 Haziran 2016, 12:28:15
Muhtemelen öyle.
ReadFile(hComm, &test, 1, &transmitCheck, NULL);
Buradaki 1  tampon uzunluğu.
Eğer seri porttan gelen değer 2 byte ise   1 olan parametreyi 2 yapman gerek. 
Göndericin veriyi Little Endian mı Big Endian mı göndriyor?  PC tarafı nasıl alıyor? Gönderdiğin veri kaç byte?
Bunları bilmeden soruna kesin cevap vermek zor.
Uzunluk parametresini 1,2 ve 4 olarak değiştirip br dene.
Ama deneme yanılmadan daha da iyisi seri portu dinleyen bir analiz programı ile gelen veriyi görmek. Gelen verinin ne olduğu bilinirse, alma kısmı daha rahat çözülür.

Analiz programı ile portu dinlediğimde gelen sayı sadece "54 55 5" gibi rastgel seri portu c den dinlediğimde gelen rakamlar 42 43 50 bu arada hep
1 olan parametreyi 2 yaptığımda gönderdiğim komutlar gitmedi.