Arduino Seri Haberleşme
  • Merhabalar,

    c# ile arduinonun haberleşmesinde takıldığım konu var kodu aşağıdaki yaptığımda sorun yaşamıyorum ama rakam yerine sayı kullanmak istediğimde sorun yaşıyorum , mesela 11 ve 12 sayılarını arduino'da nasıl okuyabilirim?


    if (Serial.available() > 0) {

    incomingByte = Serial.read();
    if (incomingByte == '1')
    {
    digitalWrite(led, HIGH);
    }
    else if (incomingByte == '2')
    {
    digitalWrite(led, LOW);
    }


    }
  • burada yazdığın koddan da anlaşılacağı gibi
    incomingByte diye bir değişkene seri bağlantıdan gelen değerleri atıyorsun. Yani senin işlemlerin hep BYTE üzerine (1 byte yani yalnızca 1 karakter (0-9 ,a-z,)) sonrada aldığın bu byte ı if in içerisinde değerlendiriyorsun.
    Fakat diyorsun ki ben 11 sayısını algılayayım. Gördüğün gibi 11 sayısı 2 BYTE.
    O zaman ne yapacaksın_?
    Bir dizi değişkeni tanımlayacaksın örneğin

    incomingstring[2]; (2 yazdık çünkü gelecek datanın maksimum 2 byte olduğunu

    varsaydık oraya 100 de yazabilirdik)

    bir tanede dizinin her bir elemanını temsil edecek sayıcı tanımlayacaksın
    örneğin

    n;

    şimdi diziyi tanımladın bu sefer ne yapacaksın gelen her byte ı dizinin içerisine yerleştireceksin.

    if (Serial.available() > 0) {

    incomingByte = Serial.read();
    incomingstring[n]=incomingByte; //aldığın bytı dizinin n'inci bölümüne atadık (başlangıçta n =0 olacağından ilk bytı dizinin 0'ıncı hanesine yazdık)
    n++;
    //böylece n=2 olduğunda anlıycaksın ki dizin artık doldu veriyi aldın
    gerekli karşılaştırma işlemlerini yapacaksın if lerin içerisinde

    if (incomingstring[0]== '1' && incomingstring[1]=='1') //gelen sayı 11 mi?
    {
    digitalWrite(led, HIGH);
    }
    else if (incomingstring[0]== '2' && incomingstring[1]=='2') //gelen sayı 22 mi ?
    {
    digitalWrite(led, LOW);
    }

    if(n==2) //dizini başarıyla aldıktan sonra bir sonraki data alımı için dizinin içerisini boşaltıcaksın
    {
    for(i=0;i<2;i++) incomingstring[i];<br />n=0;
    }


    }


    Bu algoritma sana ilham vermesi açısından hızlıca yazılmıştır. Bu progrma çalışmıyor diye cevap atmazsan sevinirim. Buradaki mantığı kullanarak kendi kodunu yazabilirsin.
  • daha basit olarak ben şöyle yaptım: (delphi 6)

    ComPort.ReadStr(Str, Count);
    Edit1.Text:=Str;
    Str2:=Copy(Str,1,Count-2); //str ye atılan değerin sağındaki 2 boşluk silinecek
    sayi:=strtoint(Str2);
  • delphi veya c# veya c veya c++ veya basic de yaparsınız arduino da nasıl yapıyorsunuz arduninoya 2 karakterlik veya n karakterlik bir bilgiyi nasıl arduino tarafından nasıl anlaşılacağını anlaymaya çalışıyor @ekmekci birader
  • mantık aynı, hangi dil olduğu farketmez:

    while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
    str += (char)inChar;
    }
    if (inChar == '\n') {
    Serial.print("Value:+5 :");
    Serial.println(str.toInt()+5);
    Serial.print("String: ");
    Serial.println(str);
    str = "";
    }
    }


  • bu şekilde okuyabilirsin kardeşim. biraz yavaş çalışır ama çalışır..





    String readString,gelen;
    int led=8;

    void setup() {
    Serial.begin(9600);
    pinMode(led,OUTPUT);
    }

    void loop()
    {
    if(Serial.available()>0){
    gelen=Serial.parseInt();


    if (gelen=="11"){
    digitalWrite(led, HIGH);
    }
    if (gelen=="12"){
    digitalWrite(led, LOW);
    }
    }
    }

  • mesajlarınız için çok teşekkür ederim.Özellikle de ekmekci , tane tane anlatmış sağolsun :)

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.