Mikro C ARM Uart Sorusu?
-
Arkadaşlar Öncelikle Merhabalar,
MikroC ve armstm32f0 ile bir araç kontrol projemiz var.Hexadecimal olarak uarttan gelen veriyi başarılı bir şekilde okuyabiliyorum.Fakat bilgisayar arayüzünden YaV1 gibi bir string gönderdiğimizde bunu ayıklamakta güçlük çekiyoruz.İstediğimiz şey ise şu Y yönü ifade etmekte ardından gelen a sol s gelirse geri,w ileri,d sağ.V ise vitesi 4 vites var V den sonra gelen rakamlar için 1 den 4 e kadar pvm değişiyor.Php'deki gibi bir substr oluşturamıyorum.Tecrübesi olan arkadaşlar yardımcı olursa sevinirim.İyi Çalışmalar.
-
string olarak mı alıyorsunuz hocam yoksa byte dizisi mi? neyse sonuç olarak string de bir dizidir (char dizisidir) bu şekilde dizinin elemanlarına ulaşarak ayıklama yapabilrisn
gelenveri[0] --> Yön gösteriyor
if(gelenveri[0] == 'Y') // yön ise { switch(gelenver[1]) // sağ-sol-yukarı aşağı kontrol için { case 'a' : //sol break; case 's' : //geri break; case 'd' : //sağ break; case 'w' : //ileri break; } } else //yöndeğilse { } if(gelenveri[2] == 'V') // hız ise { int hiz = gelenveri[3]; }
gibi bir mantıkla ilerleyebilirsin. bunu ben char dizisi olarak düşündüm. eğer byte dizi alıyorsan o zaman tür dönüşümü yapman gerek (char a cast edeceksin)
bir de strstr fonksiyonu var. şöyle bir örnek buldum
char txt = "mikroElektronika"; char txt_sub = "mikro"; char *res; res = strstr(txt_sub,txt);
burdan detayına bakabilirsin
http://www.cplusplus.com/reference/cstring/strstr/
ama gelen string verilerinde benzerlik varsa yani V harfini başka şeylerde de kullanıyorsan bu tarz bir şey kullanman karışıklığa yol açacaktır
-
unbalanced bunu yazdı
string olarak mı alıyorsunuz hocam yoksa byte dizisi mi? neyse sonuç olarak string de bir dizidir (char dizisidir) bu şekilde dizinin elemanlarına ulaşarak ayıklama yapabilrisn
gelenveri[0] --> Yön gösteriyor
if(gelenveri[0] == 'Y') // yön ise { switch(gelenver[1]) // sağ-sol-yukarı aşağı kontrol için { case 'a' : //sol break; case 's' : //geri break; case 'd' : //sağ break; case 'w' : //ileri break; } } else //yöndeğilse { } if(gelenveri[2] == 'V') // hız ise { int hiz = gelenveri[3]; }
gibi bir mantıkla ilerleyebilirsin. bunu ben char dizisi olarak düşündüm. eğer byte dizi alıyorsan o zaman tür dönüşümü yapman gerek (char a cast edeceksin)
bir de strstr fonksiyonu var. şöyle bir örnek buldum
char txt = "mikroElektronika"; char txt_sub = "mikro"; char *res; res = strstr(txt_sub,txt);
burdan detayına bakabilirsin
http://www.cplusplus.com/reference/cstring/strstr/
ama gelen string verilerinde benzerlik varsa yani V harfini başka şeylerde de kullanıyorsan bu tarz bir şey kullanman karışıklığa yol açacaktır
Hocam problemimiz kontrolde değil.Aracı zaten stabil olarak çok güzel kontrol ediyoruz.a w s d gibi değer gönderdiğimizde.Biz aracı YaV1 geldiğinde 1.viteste a yönüne gitsin istiyoruz.Fakat gelen veriyi hiçbir şekilde ayıklayamıyoruz.4 elemanlı bir diziye atsak bile kafi ama beceremedik.strstr baya bir kurcaladım.Onunlada bir sonuç elde edemedik.
-
hocam yukarıda yazdığım kodu deneme şansım yok elle yazdım ama bu mantıkla gideceksiniz.. vites ile yön verme olayını muhtemelen farklı pinlerde yapıyorsunuz. ilk if e girdiinde yön olayı için ilgili pin e çıkış verirsin, ikinci if e girdiğinde vites ile ilgili olana.. aslında bu kodu sıfır bir projeye aktarıp kendinizce bir test edin çalıştığını görürsünüz sonra kendinize göre uyarlayın
-
unbalanced bunu yazdı
hocam yukarıda yazdığım kodu deneme şansım yok elle yazdım ama bu mantıkla gideceksiniz.. vites ile yön verme olayını muhtemelen farklı pinlerde yapıyorsunuz. ilk if e girdiinde yön olayı için ilgili pin e çıkış verirsin, ikinci if e girdiğinde vites ile ilgili olana.. aslında bu kodu sıfır bir projeye aktarıp kendinizce bir test edin çalıştığını görürsünüz sonra kendinize göre uyarlayın
Farklı pinler yok hocam.Xbee ile haberleşiyor. char okunan=Uart2_read(); ile gelen veriyi okuyoruz.Örneğin "YaV1" gibi bir değer göndereyim.Okumak için tek fonksiyon var ve gelen verilerin hepsini bu kanal üzerinden yollamak zorundayım. İstediğim Komut adında bir dizi değişken olsun. Komut[0]="Y"; Komut[1]="a"; Komut[2]="V"; Komut[3]="1"; gibi ayıklamak istiyorum.Problemim ayıklamada aracı kontrol etmekte değil.
-
hocam özelden teamviewer bilgisini yolla bağlanıp bakayım istersen
-
unbalanced bunu yazdı
hocam özelden teamviewer bilgisini yolla bağlanıp bakayım istersen
Çalıştığım bilgisayar Labda evde değil malesef
-
tamam hocam ben sana teamviewer vereyim bi kod yazalım orada baklım
-
hocam o gibi diye gösterdiğin ayırması gerekiyor sanırım, önceden yaptığım bişey vardı bunun benzeri ancak bulamadım kurcalıyorum bulursam yollarım
detCode tarafından 26/Nis/14 01:08 tarihinde düzenlenmiştirchar
okunan[]=Uart2_read(); fln yapsan yemezmi ? sonra 0 ına 1 ine filan baksan
uart1_read_text() diye fonksiyonda varmış bunu dene birde pointerlı arraya at
hocam -
@detcode, hocam arkadaş bağlandı bilgisayarıma baktık biraz.
Uart2_read fonksiyonu byte byte dönderiyor. yani bir döngü içerisinde tek tek okumak gerekiyor ve char dizi değil de char olarak veriyor.
bahsettiğin uart1_read_text fonksiyonunu da arkadaşa tavsiye ettim, bununla daha kolay şekilde çözülür.