Arama butonu
Bu konudaki kullanıcılar: 1 misafir
5
Cevap
1056
Tıklama
0
Öne Çıkarma
Can Bus a veri gönderme (String to byte)
E
5 yıl
Yüzbaşı

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.



K
5 yıl
Çavuş
Konu Sahibi

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.



E
5 yıl
Yüzbaşı

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);


Bu mesaja 2 cevap geldi.
K
5 yıl
Çavuş
Konu Sahibi

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 >


Bu mesajda bahsedilenler: @EmuDev
K
5 yıl
Çavuş
Konu Sahibi

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 ?



< Bu ileti mobil sürüm kullanılarak atıldı >

_
4 yıl
Yarbay

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ı?



< Bu ileti mobil sürüm kullanılarak atıldı >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.