Visual c# ile pic e seri porttan veri yollamak

Başlatan crapdeno, 25 Kasım 2010, 15:26:59

crapdeno

Merhaba arkadaşlar pic'e ve C# a çok hakim değilim projem gereği C# da hesaplamış olduğum 4 tane float yapıdaki değişkeni( örneğin w1=0.55456, w2=0.8695 ,b=0.3454 ve x=0.4544 gibi 4 floating) seri porttan pic e vermem lazım.Yani pic e gömmüş olduğum denklemdeki değişkenlerin değerini C# da hesaplayıp Pice seri porttan almam lazım. Bunu nasıl yapabilirim fikri olan var mı?

crapdeno


Tagli

C#'ta veri yollamak çok kolay ama sanırım değişken türünün byte olması gerekiyor. Yapman gereken şey bu float'ları byte'lara bölecek fonksiyonu bulmak. Böyle birşey var mı bilmiyorum. Eğer yoksa kendin yazman gerekebilir. Daha sonra şu satırlarla yollayabilirsin:
iletisim = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
iletisim.Open();
byte[] veri = new byte[1]; //Veya daha uzun bir dizi de olabilir.
iletisim.Write(veri, 0, 1);


PIC'in içinde de bu byte'ları tekrar birleştirip float oluşturmalısın. Burada dikkat etmen gereken bir diğer nokta da derleyicilerin float değerleri ifade etme şekilleri farklı olabilir.
Gökçe Tağlıoğlu

iyildirim

herhangi bir değişkenin bellek teki görünümü bir string'e aktarmak mümkün ancak iletişimin güvenli olması veri ve kontrol karakterlerinin karişmaması için veriyi string olarak göndermek daha sağlıklı olur. veriyi string'e çevirmeyi  "stringveri = floatveri.ToString();" şeklinde yapabilirsiniz.



ferdem

Şurda da daha basit bir örnek var:
http://www.fatiherdem.net/yuklenenler/servo_ferdem.rar
Seri porttan bir anda 8 bitlik-1byte- veri gönderebiliyoruz(en fazla 0xFF=255 sayısı oluyor), float sayıların durumuna göre en uygun gönderme şeklini kendiniz belirleyebilirsiniz... Mesela ben bir senaryo atayım siz en uygunu bulursunuz: Noktadan sonra iki hane yetiyorsa göndermeden önce 100 ile çarparım, 255 e böler bir bölüm bir de kalan bulurum(kalan tam sayıya yuvarlanabilir). Bulduğum bölüm ve kalan sayısını birer byte ile gönderir PIC tarafında çarpımı tekrar yapıp 100 e bölerek float sayıya eşitlerim. İyi çalışmalar.

crapdeno

teşekkür ederim arkadaşlar çözümlerinizi araştıracağım benimde aklımda bi kaç şey var düşündümde acaba elimdeki floatingleri stringe çevirip  yollayıp pic den de string olarak alıp ordamı aldğm veriyi floatinge dönüştrsem

acocrw

merhaba ben c# dan pic'e veri yolluyorum ama picin tx ucundan gelen veriyi c#'ta göremiyorum.

görmek için yazdıgım kod:

serialport1.readexisting().tostring; yapıp textboxta göster dedim ama olmadı. neden acaba. Lütfen yardımcı olabilir misiniz?

rf

Ben float sayıları RS232 üzerinden göndermem gerektiğinde kolaylık olsun diye sayıları sprint fonksiyonu ile bir string değişkene yazıyorum

sprint(stringdegisken,"%f,%f,%f");

ör. sayıları virgülle ayırarak üç adet float sayı,
123.1233
213.5454
98.9008
123.1233,213.5454,98.9008<CR>

PIC ile stringleri aldıktan sonra
"atof() -- Convert Character String to Float" fonsiyonu ile string'e dönüştürüyorum bu şekilde kalıcı olarak saklanmak istendiğinde string şeklinde eeprom'da da saklayabilirsiniz.

Tabiki bu sadece bir yol ve ben bir çok kez kullandım. Güvenli ve stabildir. İstenirse CRC'de eklenebilir.
KOSGEB Girişimcilik Desteği Bilgi ve Paylaşım Platformu http://www.girisimcilikdestegi.com/

RcALTIN

Alıntı yapılan: acocrw - 12 Şubat 2011, 13:16:31
merhaba ben c# dan pic'e veri yolluyorum ama picin tx ucundan gelen veriyi c#'ta göremiyorum.

görmek için yazdıgım kod:

serialport1.readexisting().tostring; yapıp textboxta göster dedim ama olmadı. neden acaba. Lütfen yardımcı olabilir misiniz?

ReadExisting metodunu, sp nesnesinin DataReceived eventini oluşturarak onun içinde kullanın; sonundaki ToString() olmadan tabiki, zaten dönüş tipi stringdir o metodun...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

acocrw

teşekkür ederim beni dikkate aldıgınız için. Ama ben "DataReceived eventini oluşturarak" ne demektir bilmiyorum.

yani seri porttan bilgiyi sadece read yaptıgımızda otomatik olarak yakalamıyo mu?

DataReceived'ı neden oluşturucaz

LukeSkywalker

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
         textbox1.text=serialport1.readexisting().tostring;
        }

Şeklinde yapmalısınız. Tabi bu data received olayını kendiniz oluşturacaksınız. Direkt bu şekilde yazarsanız olmaz. Form üzerindeki seri port ikonundan event yaratacaksınız. Bu olay seri portun data aldığını anlayan olaydır.


RcALTIN

Alıntı yapılan: acocrw - 12 Şubat 2011, 22:43:31
teşekkür ederim beni dikkate aldıgınız için. Ama ben "DataReceived eventini oluşturarak" ne demektir bilmiyorum.

yani seri porttan bilgiyi sadece read yaptıgımızda otomatik olarak yakalamıyo mu?

DataReceived'ı neden oluşturucaz

Veriyi okumak için verinin geldiği anı yakalamalısınız(?) onu da kullandığınız şekilde yapmanız mümkün değil, serialport nesnesinin bu iş için bahsettiğim olayı mevcut, veriyi geldiğinde okumanız gerekir. Eğer toolbox'daki serialport nesnesini kullandıysanız properties penceresinden events kısmına(şimşek butonu) geçin ve DataReceived kısmındaki boşluğa çift tıklayın o sizin için oluşturacaktır; eğer nesneyi kod ile oluşturduysanız
private static void DataRecevied(object sender, SerialDataReceivedEventArgs e)
    {
        
    }


mevcut class içinde(yani formunuzun kodlarını yazdığınız yerde) event metodunu bu şekilde tanımladıktan sonra
spnesnesi.DataReceived += new SerialDataReceivedEventHandler(DataRecevied);

şeklinde metodu eventimize bağlıyoruz ve bundan sonra veri geldiğinde o metodumuz işliyor, tıpkı pic'deki kesmeler gibi...

bu arada takıldığınız yerlerde msdn size çok yardımcı olur, mesela üzerinde durduğumuz event:
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

acocrw

Cok tesekkur ederim hocam. Bunlari projemde  uygulucam.