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.
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.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
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.
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:
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);
//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;
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.
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ı?
Can Bus shield ile vei göndermeye çalışıyorum. Şöyle bir örnek kod var:
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 :
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.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
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. Cevapları Gizle
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:
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:
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
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ı >
< Bu ileti mobil sürüm kullanılarak atıldı >