Elektrotekno.com Ana Sayfa || Programlanabilir Cihaz ve Elemanlar || Microchip Pic Serisi


seri port a byte göndermek

Açıklama:
Elektrik, Elektronik, Haberleşme ve Otomasyon konularının ağırlıklı olarak konuşulduğu, tartışıldığı ve bilgi paylaşımı yapıldığı forumumuza hoşgeldiniz.
Şu an Kod Paylaşım ve Soru Cevap Alanı kategorisi içerisindeki Microchip Pic Serisi forumunda bulunuyorsunuz.
Bu sayfada üyelerimizin "seri port a byte göndermek" konusundaki problem, görüş ve önerileri okuyabilir ayrıca konu hakkındaki doküman, resim, proje, devre ve programlara ücretsiz olarak ulaşabilirsiniz. Üye olduktan sonra sizler de konu hakkında sorular sorabilir ya da yorum ve paylaşım yaparak birikimlerinizi aktarabilirsiniz.
Forumdan tam olarak yararlanabilmek için üye olmayı unutmayınız!
Kayıt: 30 Ksm 2005
Mesajlar: 32
Konum: İSTANBUL
Offline
yavuz_eses
Tarih: 01 12 2008 22:31

merhaba, c# da yapma çalıştığım bir uygulamam var. virtual earth programını programıma entegre ettim. resmi burda http://rapidshare.com/files/169284221/Ads__305_z.jpg
harita üstünde bir noktaya tıkladığınızda koordinat bilgisini textbox lara yazdırıyorum. bu bilgileri buradanda seri port vasıtasıyla 16f28 e aktarıyorum. koordinat bilgilerinin virgülden önceki ve virgülden sonraki kısımlarını ayrı değişkenlerde tutuyorum. yani latitude verisi 41,2282 olduğunu kabul edersek
string lat_tam;
string lat_onda;

lat_tam da 41 lat_onda değişkeninde ise 2282 tutuluyor.

pic programı ise kısaca şöyle

en_tam var byte
en_onda var byte

ANADONGU:
SERIN2 PORTB.1,396,[ en_tam,en_onda] '2400 baud rate
LCDOUT $FE,$C0,en_tam,en_onda 'ikinci satıra yazdırıldı.
TOGGLE PORTB.4
PAUSE 250
goto anadongu

c# da seri porta veri göndermek için kullandığım kod ise
serialPort.Write(lat_tam);
serialPort.Write(lat_onda);

benim problemim burada başlıyor, lat_tam verisini write methodu ile gönderdiğimde 41 değeri 4 ve 1 olmak üzere ayrı ayrı gönderiliyor. yani pic bunu alırken en_tam içine 4 ü en_onda içine 1 i alıyor. bu 41 değerini nasıl tek bir byte olarak gönderebilirim?
Kayıt: 28 Ksm 2006
Mesajlar: 26

Offline
izguden
Tarih: 02 12 2008 08:45

Selam yavuz_eses;
Serialport.write(veri) methodunu kullandığında, veri kısmı string olarak tanımlanır. Bu yüzden pic senin verini ayrı ayrı char olarak tanımakta.
Bilgisayar ile pic arasında kendine göre bir veri iletişim protokolü yazarsan bütün verileri aynı anda gönderebilirsin.
Serialport.Write(Byte[], Int32, Int32) methodunu kullanırsan belli bir sayıdaki byte arka arkaya gönderirsin. 10 bytelık bir veri göndereceğin zaman şu şekilde yazman gerekli:
Serialport.Write(ByteVerisi, 0, ByteVerisi.Length)
Burada 0: başlangıç byteını, ByteVerisi.length ise gönderilecek veri uzunluğunu tanımlar.
Eğer bytelarla uğraşmayıp bir char array gönereceksen, o zamanda Serialport.Write(CharVerisi[], Int32, Int32) şeklinde veri göndermen gerekir.
Bence tüm veriyi birleştirip bir protokol yazmak daha profesyonelce olur. Eğer bununla ilgili soruların olursa cevaplarım.
İyi çalışmalar
Başa dön
Kayıt: 30 Ksm 2005
Mesajlar: 32
Konum: İSTANBUL
Offline
yavuz_eses
Tarih: 02 12 2008 21:32

öncelikle cevabınız için teşekkür ediyorm. Yeni bir protokol yaz derken SerialPort sınıfının yerine geçecek bir sınıfmı yazayım? Çok da iyi değilim programlama konusunda bu çok zamanımı alabilir. Bu işi için nereden başlayacağımı bile kestiremiyorum. Tüm veriyi bireştirip gönderme işi sorun çıkarablir. odalıklı bir sayıyı pic içine nasıl alacağım. 41,2282 değeri örneğin. ayrı ayrı göndermek daha kolayıma geliyor. Birde pic programında byte yada word tipinde değişken kullanacağım. koordinat değerleri sınırları aşabilir. Aslında SerialPort.Write(Byte[],INT32,INT32) metodunu tek elemanlı bir dizi oluşturup
byte [] buffer=new byte [1];
lat_tam2 = Convert.ToByte(lat_tam);
buffer[0] = lat_tam2;
serialPort.Write(buffer, 0, 1);

şeklinde gönderebilirim ama bu bana çok acemice geliyor. Tek elemanlı bir dizi oluşturmak çok saçma geldi bana." Bence tüm veriyi birleştirip bir protokol yazmak daha profesyonelce olur." demişsiniz tamamen katılıyorum. Bu işi nasıl yapmam gerekiyor kabaca anlatırmısnız? İnternette bir çok kaynak vardır mutlaka konuyla alakalı, direk oralara da yönlendirebilirsiniz. tekrar teşekkürler
Başa dön
Kayıt: 28 Ksm 2006
Mesajlar: 26

Offline
izguden
Tarih: 02 12 2008 22:54

Selamlar,
Benim bahsettiğim seriport prokolü değildi. Zaten bunu frameworkten hazır bir component olarak kullanıyosun. Benim bahsetmek istediğim bir veri stili oluşturman. Bu şekilde yaparsan latitude, longitude, altitude verilerin tek bir mesajda gönderebilirsin.
Mesela;
Mesaj başlangıcı 0A olsun,
Latitude verisinin integer kısmı 4 hex lik bir arrayde (max ve min değerlerini bilmediğim için. Artırabilirsin yada azaltırsın. (Float değerler 4 byte lık verilerde tutulur.))
Aynı şekilde longitude 4 byte,
altitude 4 byte olsun,
CRC kodunda Xor lanmış hali olsun.
Toplam mesajımız ne yaptı 1 (header) + 4 (Latitude) + 4 (longitude) + 4(altitude) + 1 (CRC) = 14 arraylik bir hex mesajımız oldu.
byte[] mesaj=new byte[14]
Bunu seri porttan gönderirken de serialport.Write(mesaj,0,mesaj.length)
Bütün veri tek hamlede gönderilmiş olur. Daha sonra yapman gereken ise Pic te bu kodları tek tek çözmen.

byte[] FloatToByte(float f) //float u 4 bytelık arraye çevirir.
{
byte[] output = new byte[4];
byte[] temp = BitConverter.GetBytes(f);
for (int x = 0; x < 4; x++)
output[3-x] = temp[x];
return output;
}

byte[] DoubleToByte(double d) //double değeri 8 bytelık arraye çevirir.
{
byte[] output = new byte[8];
byte[] temp = BitConverter.GetBytes(d);
for (int x = 0; x < 8; x++)
output[7-x] = temp[x];
return output;
}

float ByteToFloat(byte[] bytes, int index) //4 byte lık arrayi float değere çevirir.
{
float value = BitConverter.ToSingle(bytes, index);
return value;
}

double ByteToDouble(byte[] bytes, int index) //8 byte lık arrayi double değere çevirir.
{
double value = BitConverter.ToDouble(bytes, index);
return value;
}

Mesela;
buffer = (int)ByteToFloat(yukseklik, 0);

Yukarıda yazmış olduğum kodlar,
IEEE Standard 754 for Binary Floating-Point Arithmetic standardına göredir.

64-bit Double Precision Floating Point Veri Yapısı
İşaret : 0
Üst : 1-11
Kesir : 12-63

32-bit Single Precision Floating Point Veri Yapısı
İşaret : 0
Üst : 1-8
Kesir : 9-31

Kolay gelsin
Başa dön
Kayıt: 30 Ksm 2005
Mesajlar: 32
Konum: İSTANBUL
Offline
yavuz_eses
Tarih: 02 12 2008 23:29

anladım, söyledikleriniz üzerine konuyu tekrar ele alabilirim. yardımlarınız sayesinde kafamdaki karışıklığı azaltabildim. pic kısmında pic basic kullanıyorum. float verileri pic basic te kullanamıyoruz zannedersem, pic c öğrenmem gerekecek. İlginiz için çok teşekkürler.
Başa dön



seri port a byte göndermek


Benzer Konular

- Programlama sorunu (Tanımlama yapıldıktan sonra aynı adda farklı port tanımlama)

- c sharp ile seri port okutmak isteyenler buraya
- pic seri iletişim
- Seri kapasitörlü Tristor Kontrollü Reaktor
- dc seri motor ile üniversal motoru karşılaştırınız
- Pic16F877 ile Seri Haberleşme Uygulaması
- Zaman Ayarlı Paralel Port Röle Kontrol(Tavsiye Edilir)
- seri rlc devrelerinde rezonans ve q faktörü(deney raporu)
- seri dc motorla ilgili soru

- seri iletişim devresi

- Bilgisayarlar İçin Seri Porttan IrDA Kontrol

Sitemize üyelik ve içeriğin indirilmesi tamamen ücretsizdir. Sitemizde paylaşılan tüm dokümanlar (Tezler, makaleler, ders notları, sınav soru cevaplar, projeler) paylaşımcıların bireysel çalışmaları olup telif hakları kendilerine aittir ya da açık bir şekilde kamusal alana yerleştirilmiş dokümanların birer kopyalarıdır. Kişilerin bireysel çalışmalarını sitemizde yüklemesinde, sitemizde paylaşıma teşvik eden puanlama sisteminin de etkisi büyüktür. Bunlara rağmen hala size ait olan ve burada bulunmasına izin vermediğiniz dokümanlar varsa iletişim bölümünden yöneticilere bildirmeniz durumunda derhal silineceklerdir.
Powered by phpBB | Translated by phpBB Türkiye | Ads by Google Adsense | Design by Crazy Bat based
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72