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