Ana içeriğe git

Haberler

Konu: Can Bus la Text gondermek ? (530 Kez okunmuş) önceki konu - sonraki konu

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.
  • M_B
  • [*][*]
Can Bus la Text gondermek ?
Merhabalar
Elimizde bir master bir tanede node ( slave ) cihazımız var bunlarda can bus la haberleşiyor.
Can bus la 50 karekter veriyi nasıl gönderebiliriz.
Can busla bir seferde 8 byte veri gonderebiliyoruz.
Aklıma gelen ilk yöntem : Şimdi diyeceksiniz ki gonderecegimiz karakterleri bir diziye atıp parcalayarak karsı tarafa göndermek.
Daha başka nasıl bir mantık algoritma kurabiliriz.




  • Tagli
  • [*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #1
CAN bus ile ilgili bilgim sıfıra yakın ama yine de sorayım dedim: Üst seviye katmanları kulanmak burada bir seçenek olabilir mi? Mesela CANopen gibi? Bunlarda belki söz konusu duruma yönelik çözümler olabilir.
Gökçe Tağlıoğlu

  • M_B
  • [*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #2
CAN bus ile ilgili bilgim sıfıra yakın ama yine de sorayım dedim: Üst seviye katmanları kulanmak burada bir seçenek olabilir mi? Mesela CANopen gibi? Bunlarda belki söz konusu duruma yönelik çözümler olabilir.
Haklısınız hocam o katmanları da şu an ben de bilmediğim için sordum.
Bir araştırayım bakayım. Ne bulacam.
Peki katmanları kullanmak istemesek nasıl yaparız ?

  • ashes
  • [*][*][*][*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #3
50 byteı stream olarak gönderin. Yani byte stuffing yapıp mesajın başlangıç bitişini işaretleyin karşıya 8 8 gönderin toplayıp çözün.

  • M_B
  • [*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #4
50 byteı stream olarak gönderin. Yani byte stuffing yapıp mesajın başlangıç bitişini işaretleyin karşıya 8 8 gönderin toplayıp çözün.
@ashes hocam
Ornek olarak şu şekilde bir yapımız var.
Kod: [Seç]

typedef struct {
  uint32_t can_id;  
  uint8_t     len; 
  uint8_t data[8];  
}CAN_TX_FRAME_t;

CAN_TX_FRAME_t myTXFrame;

    myTXFrame.can_id=0x01;  // ilgili id.
    myTXFrame.len=8;  // Gidecek veri uzunlugu
   
CAN_write(myTXFrame);   // veri gonderme fonksiyonu.

hocam şimdi şu şekilde de bir göndermemiz gereken Text bilgimiz var.
uint8_t Text[50];
Text="Bu bir Test yazisidir";

Şimdi bunu nasıl uyarlayıp gönderebilirim.
Musait olduğunuz da bir şeyler yazabilirmisiniz.


Teşekkürler.





  • ashes
  • [*][*][*][*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #5
50 byteı stream olarak gönderin. Yani byte stuffing yapıp mesajın başlangıç bitişini işaretleyin karşıya 8 8 gönderin toplayıp çözün.
@ashes hocam
Ornek olarak şu şekilde bir yapımız var.
Kod: [Seç]

typedef struct {
  uint32_t can_id;  
  uint8_t     len; 
  uint8_t data[8];  
}CAN_TX_FRAME_t;

CAN_TX_FRAME_t myTXFrame;

    myTXFrame.can_id=0x01;  // ilgili id.
    myTXFrame.len=8;  // Gidecek veri uzunlugu
   
CAN_write(myTXFrame);   // veri gonderme fonksiyonu.

hocam şimdi şu şekilde de bir göndermemiz gereken Text bilgimiz var.
uint8_t Text[50];
Text="Bu bir Test yazisidir";

Şimdi bunu nasıl uyarlayıp gönderebilirim.
Musait olduğunuz da bir şeyler yazabilirmisiniz.


Teşekkürler.

Veriyi 8 bytelık parçalara bölmek durumundasınız buna yapabileceğiniz pek birşey yok. Hatta hiç veri kaybı olmadığını kabul edersek (CanBus bilgim yok donanım seviyesinde paket kovalar mı kovalamaz mı bilmiyorum)

Kod: [Seç]

CAN_TX_FRAME_t myTXFrame;
uint32_t                i, data_len;

myTXFrame.can_id=0x01;  // ilgili id.
myTXFrame.len=1;  // Gidecek veri uzunlugu
   
myTXFrame.data[0] = 0x02;
CAN_write(myTXFrame);

Karşı tarafta alışta 50 bytelık buffer açın her gelen veriyi kontrol edin. Stringin son karakteri 0 olacaktır. Bu bilgiyi aldığınızda hattan ilk aldığınız veriye bakın o da 0x02 olacaktır. Bu bilgiler tutuyorsa ve CanBus verileri zaten CRC kontrolü eşliğinde yolluyorsa veriyi alabildiniz demektir.

  • M_B
  • [*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #6
Hocam Canbusta Cihaz ID si değil Mesaj ID si olduğu için gondermek için şu şekilde yapacam.

Tek bir nodun icine
PaketID1
PaketID2
PaketID3
PaketID4
PaketID5
PaketID6
PaketID7
ID tanımlaması yapıp

Gondermek istediğim Text iceriğini ise 8 byte olarak sirası gelen PaketID ye gore
data icerisine kopyalayıp gonderecem.


CanWrite(PaketID1, data, Uzunluk, Flag);
Şeklinde gönderme yapacam.
Karşı taraftanda

CanRead(&ID,data,uzunluk,Flag);
yaparak
select Case veya if icine  PaketID leri karşılaştırıp ilgili Diziye  sirasına gore koyacam.









  • ashes
  • [*][*][*][*][*]
Ynt: Can Bus la Text gondermek ?
Yanıt #7
Eğer mesaj kaybı yoksa tek bir mesaj ID ile de yapılabilir ama aklınıza bu şekilde yattıysa en iyi yöntem sizin için budur .