Şimdi Ara

Can Bus a veri gönderme (String to byte)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir - 3 Masaüstü
5 sn
7
Cevap
0
Favori
876
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba

    Can Bus shield ile vei göndermeye çalışıyorum. Şöyle bir örnek kod var:

    quote:

    byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

    void loop()
    {
    // send data: ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
    byte sndStat = CAN0.sendMsgBuf(0x100, 0, 8, data);
    if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
    } else {
    Serial.println("Error Sending Message...");
    }
    delay(100); // send data per 100ms
    }


    bu koddaki byte data değişkenini Run time da tanımlamak istiyorum. Fakat gidecek datanın boyutu her zaman farklı olabiliyor.
    Bazen 3 byte bazen 8 byte oluyor.

    Elimdeki data şu şekilde :

    quote:


    0x548 3 0x01 0x00 0x00

    Buradaki 0x548 değeri id ,
    3 rakamı byte uzunluğu
    0x01 0x00 0x00 değeri gidecek olan byte bilgisi

    bu koddaki 0x01 0x00 0x00 string değerini nasıl byte a çevirip gönderebilirim.

    Arduino da 0x01 0x00 0x00 string değerini nasıl şu şekilde convert edebilirim:
    byte data[3] = {0x01, 0x00, 0x00};
    Burada 3 olan byte uzunluğunu da run time da ayarlamam geekiyor.

    Ben elimdeki string veriyi strtok ile parse ediyorum.
    ilk veri olan 0x548 string değerini de unsigned long a çevirmem gerekiyor.
    Bu işlem için atol komutu yeterlimidir?

    Yardım ve tavsiyeleriniz için şimdiden teşekkürler.



  • 0x ile başlayan ifadeler 16'lık tabanda yazılmış olan sayılardır, string değil. Bu sayıları herhangi birşeye çevirmeden direkt olarak kullanabilirsin. Veri en fazla kaç byte olacaksa o uzunlukta bir dizi tanımlarsın. En fazla 8 demişsin, + 1'de kaç byte olacağının bilgisi, yani 9.

    byte data[9];

    Çalışırken verileri ürettik. Bunları diziye yazıyoruz.

    data[0] = veri_uzunlugu;
    data[1] = veri1;
    data[2] = veri2;
    ...

    Ve transfer ediyoruz.
    CAN0.sendMsgBuf(0x548, 0, veri_uzunlugu + 1, data);
  • EmuDev E kullanıcısına yanıt
    Sn emuDEv ilginiz için teşekkür ederim.

    Ben veriyi sd karttan alıp can busa göndermeye çalışıyorum. Karşılaştığım sorunlar C diline hakim olmadığımdan kaynaklanıyor.

    SD karttaki verilerim şu şekilde:
    quote:

    0x40A 6 0x0A 0x02 0x40 0x01 0x00 0x00
    0x400 6 0x00 0x02 0x80 0x00 0x00 0x00
    0x457 3 0x01 0x00 0x00
    0x470 5 0x00 0x01 0x00 0x00 0x00
    0x531 4 0x00 0x00 0x90 0x90
    0x571 6 0x92 0x5F 0x00 0x0B 0x04 0x00


    ilk veriyi String gelmis = dosya.readStringUntil('\r'); komutu ile alıp string içine atıyorum.
    Burada ilk kelime id değeri ve unsigned long ikinci değer byte uzunluğu ve int tipindedir.

    gelmis içine aldığım veriyi strtok ile parse ediyorum. Şu şekilde:
     boyu=gelmis.length();
    char buf[boyu];
    gelmis.toCharArray(buf,sizeof(buf));
    char *p=buf;
    char *str;

    while((str = strtok_r(p," ",&p))!=NULL){//bosluk karakterine göre ayrım yapılsın
    //ilk veri ise bu veri id dğeridir ve unsigned long a cevirilir
    if(sirasi == 0){
    char value[10];
    char *eptr;
    int boyu=veri.length() +1;
    strcpy(value, str);
    id = strtoul(value, &eptr, 16);
    char buff[10];
    veri.toCharArray(buff,10);
    Serial.print("buff ");
    Serial.println(buff);
    char buf[10];

    Serial.print("id si: ");
    Serial.println( id);
    Serial.println((unsigned long int) id);

    if(sirasi == 1){//byte uzunluğu bilgisini int e cevir
    Serial.print("sira 1");
    databoyu = atoi(str);
    Serial.print("boy : ");
    Serial.println(databoyu);

    if(sirasi == 2){//byte cevir
    String s2 = str;
    s2.getBytes(ab, sizeof(ab));
    }
    if(sirasi == 3){// byte cevir
    String s3 = str;
    s3.getBytes(bb, sizeof(bb));
    }
    }
    }
    }

    ......//data byuna göre ilgili procedure gidip veriyi gonder
    switch(databoyu){
    case 1:
    CanSend_1(id, ab);
    break;
    case 2:
    CanSend_2(id, ab, bb);
    break;


    ......
    //can e gönderelim
    void CanSend_2(INT32U address, byte a, byte b){
    unsigned char DataToSend[2] = {a,b};
    byte gidecek = CAN0.sendMsgBuf(address, 2, DataToSend);

    //mesajın gidip gitmediğini denetleme gitmediyse 20 defa daha gönder
    if(gidecek == CAN_OK){
    Serial.println("Message gitti! ilk seferde");
    delay(4000);
    }else{
    Serial.println("Error Sending gitmedi...lk seferde");
    delay(10);
    int kacdefa=0;

    while(gidecek != CAN_OK){
    Serial.println("kac defa : ");
    Serial.print(kacdefa);
    kacdefa++;
    if(kacdefa >=20 ){
    break;
    }
    Serial.println("dongude");
    delay(150);
    gidecek = gidecek = CAN0.sendMsgBuf(address, 3, DataToSend);
    if(gidecek == CAN_OK){
    Serial.println("Message gonderildi!..TEKRARDA");
    Serial.println("dongude");
    delay(2000);
    }
    }
    }

    bu işlemlerde ve convert de mi hata yapıyorum emin değilim ama mesajı gönderemiyorum gitti cevabını alamıyorum.



    < Bu mesaj bu kişi tarafından değiştirildi kahraman1285 -- 11 Nisan 2020; 14:42:17 >
  • Mesajı gönderemiyorsan öncelikle bu sorunu halletmelisin. Sabit veriler üzerinde denemeler yapmanı öneririm. Haberleşmenin çalıştığına emin olduktan sonra dosya okuma ve string dönüşümlerine geçebilirsin.
  • Seedstudio uretimi modul kullaniyorum ve bu moduldeki calisma modlari:

    MCP_NORMAL
    MCP_LISTENONLY
    MCP_LOOPBACK

    bu midlardan sadece loopback modunda gonderim yapabiliyorum. Bu normal bir durum mudur ?
  • quote:

    Orijinalden alıntı: EmuDev

    0x ile başlayan ifadeler 16'lık tabanda yazılmış olan sayılardır, string değil. Bu sayıları herhangi birşeye çevirmeden direkt olarak kullanabilirsin. Veri en fazla kaç byte olacaksa o uzunlukta bir dizi tanımlarsın. En fazla 8 demişsin, + 1'de kaç byte olacağının bilgisi, yani 9.

    byte data[9];

    Çalışırken verileri ürettik. Bunları diziye yazıyoruz.

    data[0] = veri_uzunlugu;
    data[1] = veri1;
    data[2] = veri2;
    ...

    Ve transfer ediyoruz.
    CAN0.sendMsgBuf(0x548, 0, veri_uzunlugu + 1, data);

    Konu dışı ama bilginiz olduğu için yazıyorum. Arduinoda analog read pot 0 ila 1023 mü neydi ama biz bep map yapıp 255 e kadar düşürüyoruz, canbus ile 2 arduino arasında bu veriyi map yapmadan aktarma ve okuma imkanımız varmı?

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.