Arkadaşlar pic den -0.06,-0.06 degerini rich textboxa yazdırmak istiorum , ama ifadeyi nasıl tanımlaycagımı bulamadım
Program şöyle ;
private void button1_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.Open();
}
string veri =richTextBox1.Text;
serialPort1.WriteLine(veri);
}
Veri de dediğim gibi -0.06,-0.06 diye hem rakam hemde "," ve "." ifadeleri var dolayısıyla string veri de string yerine ne yapacagımı bilemedim.
Sorum basitse kusura bakmayın c# a yeni başladım şu 1 haftada bitirme projem için çözmem gereken bir durum.
Şimdiden teşekkürler.
okuma yapıp bunu richtextbox'a yazdırmak istediğinizi söylemişsiniz. Yazılımda tam tersinizi yapmaya çalışmışsınız.
picten gelen değerleri aşağıdaki gibi okumanız lazım.
richtextBox1.Text = sp.ReadExisting();
herhangi bir integer veya diğer sayısal değişkenleri string değişkene şöyle aktarabilirsiniz:
double a=2131.5;
string b = Convert.ToString(a);
MessageBox.Show(b);
string gelen;
gelen=convert.tostring(serialport1.readexisting());
richTextBox1.Text=gelen;
Öncelikle meftun ve semih arkadaşlara teşekkür ederim.
Su anda boarda baglı rs232 usb kablosunun lehimi gitti , yarın onu halledip söylediginiz kodları deniyecem , olmassa gene yardımınızı rica edicem
1 hafta sonra teslim mi ediceksiniz bitirme ödevinizi ?
2 ay sonraya bitmesi gereken biritrme projesi.Ben fizik mühendisliği okuduğum için elektronik ve bilgisayar programlama becerim temel düzeyde dolayısıyla acele etmeye çalışıorum .Rs232 ile devreyi kurdum ama bilgsayarla olan baglantısını c# ile yaazacagım programa aktarmam lazzım acil , çünkü proje raporu , elektronik devreye bastırma ve diğer derslerde var.
serialport1.readexisting() koduyla veriyi almaya başardım.
Şimdi gelen veri 23.35,23.44 gibi durmadan değişen iki veri.Bu string veriyi Split('.') ile "." ya parçaladım amaverileri ayrı ayrı kutulara atmayı beceremedim.
Yani a ve b diye 2 kutu olacak ve onlara sırasıyla 23.35 ve 23.44 degerlerini atayıcam.
veri = serialPort1.ReadExisting().Split(','); şeklinde parçalıorum ama "." dan evvelini ve sonrasını nasıl ayrı ayrı kutulara atıcam bilemiyorum.Yardım edebilirseniz çok sevinirim.
Şimdiden çok teşekkürler
2 ayrı label veya textbox felan işinizi görüyorsa çok basit aslında.
gece gece bir şeyler saçmaladım ezberden. Yalnışlıklar olabilir çünkü visual studioyu açmayla zaman kaybedip strees olana kadar foruma direkt yazarım.
string ana_deger="23.35";
string tam_kisim,ondalik_kisim;
int noktanin_sirasi=0;
noktanin_sirasi= okunan.IndexOf(".", 10); //. nokta karakterini bul ve sırasını ver.
//eğer sürekli 2 basamaklı sayılarla çalışıyorsanız nokta hep 3. karakter olacağından bu işlemi yapmaya gerek yok.
//fakat basamak sayısı değişiyorsa noktanın kaçıncı basamakta olduğunu bulmak için indexof'u kullanmak gerekir.
if(noktanin_sirasi!=-1) {} //eğer noktayı bulduğunda extra işlem yapmak isterseniz buraya yazınız. Ama gerek yok böyle birşeye
if(noktanin_sirasi==-1){} //eğer sayının içinde nokta olmadığı bir durumda uyarı felan verecekseniz buraya yazabilirsiniz.
//noktanin_sirasi değişkeni bize noktanin soldan kaçıncı karakter olduğunu belirtir. 2 basamaklı bir sayıda 3. karakter olur.
tam_kisim = ana_deger.Substring(1, 3); // ana değer değişkeninin 1. karakterinden 2. karakterine kadar olan bölümü tam_kisim
tam_kisim = ana_deger.Substring(1, noktanin_sirasi); // ana değer değişkeninin 1. karakterinden noktanin_sirasi değişkeninin değerine kadar olan kısım
ondalik_kisim = ana_deger.Substring(3, 5); // ana değer değişkeninin 2. karakterinden 5. karakterine kadar olan bölümü tam_kisim
ondalik_kisim = ana_deger.Substring(noktanin_sirasi,noktanin_sirasi+2); // ana değer değişkeninin . karakterinden itibaren 2 karakter sonraki kisim
label1.text=tam_kisim;
label2.text=".";
label3.text=ondalik_kisim;
Alıntı yapılan: Bloodofvol - 01 Nisan 2013, 23:32:58
serialport1.readexisting() koduyla veriyi almaya başardım.
Şimdi gelen veri 23.35,23.44 gibi durmadan değişen veri.Bu string veriyi Split('.') ile "." ya parçaladım amaverileri ayrı ayrı kutulara atmayı beceremedim.
Yani a ve b diye 2 kutu olacak ve onlara sırasıyla 23.35 ve 23.44 degerlerini atayıcam.
veri = serialPort1.ReadExisting().Split(','); şeklinde parçalıorum ama "." dan evvelini ve sonrasını nasıl ayrı ayrı kutulara atıcam bilemiyorum.Yardım edebilirseniz çok sevinirim.
Şimdiden çok teşekkürler
23.35 ve 23.44 değerlerini ayrı ayrı yerlere atıcaksan zaten "." ya göre ayırman yanlış olur. İşlemciden veri gönderirken arada bir boşluk bırak. "23.35 23.44" gibi gönder. Daha sonra boşluk karakterine göre split ile ayırma yap ve nereye istersen oraya yazdır. Ufak bir kod yazıyım
gelen = Convert.ToString(serialPort1.ReadExisting());
label1.Text = gelen.Split(' ')[0];
if (gelen.Split(' ').Length > 1)
label2.Text = gelen.Split(' ')[1];
Çok teşekkürler Semih hocam ve Meftun hocam.Yazdıgınız kodlar çok işe yaradı , ve programda yazdıgım a = "23.45,23.33" gibi ifadeleri "," ile bölüp kutulara atadım.
Şimdi bir problem daha oldu ama , yazdıgım serialportla ilgili komutta sadece portu açıp kapamak üzerine komutlar var , sanırım picden gelen veriyi zamanında alamıoyrum.
Veri alma butonuna ilk bastıgımda , veriyi almıor ama 2yada3 saniye sonra basınca veriyi alıyor.Aldıgım bu veride indexof komutuyla virgülün yerini bulup yazdırıorum , ama vigrüle göre bölüp richtextboxa atıyınca "Length cannot be less than zero." die hata verio.
program şöyle;
private void button1_Click_1(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.Open();
}
string gelen;
gelen = Convert.ToString(serialPort1.ReadExisting());
int sıra = 0;
sıra = gelen.IndexOf(',');
string sıradegeri = Convert.ToString(sıra);
string ilkdeger;
ilkdeger = gelen.Substring(0, sıra);
string gelendeger = Convert.ToString(ilkdeger);
richTextBox3.Text = gelendeger;
richTextBox1.Text = sıradegeri;
richTextBox2.Text = gelen;
}
Normalde ifadede virgül yoksa sıradegeri ni -1 diye gösteryor.Dedigim gibi buttona programı actıktan 3 sanie sonra basınca veri alabiliorum , ama virgüle bölünce sorun oluyor.Sanırım verinin geldigi anı yakalayamıyınca -1 . karakteri akıyor program dolayısıylada böyle bir hata verior.
Kısacası sorum ; pic den gelen veriyi programda buttona basar basmaz nasıl alabilirim ve bu sorundan nasıl kurtulabilirim.
Şimdiden teşekkürler.
Forma timer ekle. Buton_click fonksiyonuna yazdığın kodları timer_tick fonksiyonuna yaz. Yani timer_tick fonksiyonu ile gelen verileri oku.
Yanlış Gidiyorsunuz.
Serial Port timer a bağlanmaz. Eğer timer a bağlarsanız timer ın tick olayının dışında gelen veriyi kaçırırsınız.
Bunun için başka bir treadh oluşturmanız gerekir.
Siz gelen veriyi bölmeye çalışırken oluşturduğunuz bu tread seri portu dinlesin.seri porttan veri geldiğinde doğru alasınız.
gelen veriyi bölme işlemide yanlış gidiyor. MCU dan gönderilen bilginin sprintf gibi bir fonksiyonla "Formatlanmış" olması gerekir ki nereden neyi ne kadar alacağınızı bilin.
örnek mcu dan gönderdiğim string katarı
char Deger[48];
sprintf (Deger,"P%2.2fB%2.2f\n",PV,Bat);
USART_puts(USART3,Deger);
buda bilgisayarda alıp böldüğüm fonksiyonlardan birkaçı
textStartAdress = (InStr(Me.TextBox1.Text, "P")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "B")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
PvVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label3.Text = PvVoltage
End If
textStartAdress = (InStr(Me.TextBox1.Text, "B")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "C")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
BatVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label5.Text = BatVoltage
End If
yukardaki kodun çalışmasını anlatayım.
MCU dan gelen bilgiden önce "P" nin -ki bunu bilerek değerin önüne ben koydum- satır içerisindeki yerini buluyorum. Sonrasında Gelen bilginin içerisindeki "B" nin yerinide buluyor aradaki değeri kesip alıyorum. Böylelikle değer değişiminden kaynaklı olan fazla bilgi alma yada az bilgi alma ve bunları yanlış yerlere label yada textbox gibi atma durumunun önüne geçmiş oluyorum.
belki kodlar işinize yaramayacak ama en azından bir yol çizer.
muhittin_kaplan dediğiniz belirli verileri göndermek için mi? Ben sürekli değişken veriler ile çalıştığım için verileri bu şekilde bilgisayara aktarıyorum.
Yok hocam istediğiniz veri olsun. Timer a bağlarsanız bir yerlerde hatalı almaya başlarsınız.
ben genelde PC de VB.net kullanıyorum. C# da çevirirsiniz.
Dim WithEvents mySerialPort As SerialPort = New System.IO.Ports.SerialPort
Delegate Sub SetTextCallback(ByVal [text] As String)
ile seriport oluşturulup delegate oluşturuluyor.
seri portun event ine settext e yönlediriyor.
Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mySerialPort.DataReceived
SetText(mySerialPort.ReadLine)
End Sub
aşağıdaki fonksiyon ilede bilgiyi alıyorum.
Private Sub SetText(ByVal [text] As String)
Try
If Me.TextBox1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
End If
TextBox1.Text = [text]
..
..
..
..
Teşekkür ederim yardımlarınız için ama hala sorunu çözemedim.Bu receivebuffer tarzı bişey c# da nasıl kullanılır.Gelen veriyi geçici hafızya ekleyip buyyona basınca yazdırmayı düşünüyorum.
Arkadaşlar son bir sorum olacaktı.
herhangi bir şekilde dizi kullanmadan "23.44,22.34,45.23....." gibi veriler alıorum.
split komutuyla yada visual basicde ki mid komutu tarzı bir komutla ilk virgülden sonrasını nasıl yazdırabilirim.
Yani verim "23.44,22.34,45.23" ise ben , gülden sonrasını yazdırmak istiorum herhangi bir şekilde dizi kullanmadan.
"22.34,45.23" gibi.
şimdiden teşekkürler.
instr komutunu kullanırım genelde ben. aradığın karanterin string içerisindeki yerini verir.
dim yer as integer
yer=instr(aramayapılacakString, ",")
dersensoldan sağa dolgu ilk virgül ün yerini verir.
sonrasında
textbox=mid(bölünecekString,yer,(bölünecekstring.leght-yer))
dersen bölünecek string i "yer" den başlayarak bölünecekstrin in uzunluğu kadar dan yer in çıkarılarak kalanı bulunur ve okadar alınır.
bölünecekstring="23.44,22.34,45.23"
yer=6 olur (instr den dönen değer)
bölünecekstring.leght=17
bölünecekstring.leght-yer=11
yani
textbox=mid(bölünecekString,yer,(bölünecekstring.leght-yer))
ile 6 dan başlayarak 11 karakteri textbox a atar.
.net de substring gibi fonksiyonlarda var. ben alışkanlıktan dolayı bunlarıda kullanabiliyorum..
Ama bunlar visual basic comutu deilmi.Bende bu şekilde kullandım visual basicde ama seri port kodlarında ssorun çıktı veriyi alamadım ve c# a geçtim oyuzden.Mid gibi bir komut bulamadım c# da mid(string , 2) deyip stringde 2. haneden sonrasını yazdırsın yada baktıklarımı yanlış anlıyorum.
c# ile vb.net arasında komut olarak
"öyle büyük farklar" yoktur. Yukarda yazdıklarımı C# syntax ına göre yazarsanız çalışır.
mesaj birleştirme:: 09 Nisan 2013, 22:33:56
Alıntı yapılan: Bloodofvol - 09 Nisan 2013, 12:30:57
Ama bunlar visual basic comutu deilmi.Bende bu şekilde kullandım visual basicde ama seri port kodlarında ssorun çıktı veriyi alamadım ve c# a geçtim oyuzden.Mid gibi bir komut bulamadım c# da mid(string , 2) deyip stringde 2. haneden sonrasını yazdırsın yada baktıklarımı yanlış anlıyorum.
Olmaz Mid Komutunun parametreleri
textebox=mid(AlıntıYapılacakString, AlıntınınBaşlayacağıNokta, AlıntınınNekadarUzunluktaOlacağı)
olarak 3 tanedir.
Gelen datayı ne zaman nerde dinleyeceğin üstadlarımızın söylediği gibi çok önemli..
string Rdata = ReceiveData();
public string ReceiveData()
{
if (!this.mySerialPort.IsOpen)
throw new Exception("Port not open.");
try
{
StringBuilder result = new StringBuilder();
if (mySerialPort.BytesToRead == 0)
{
int retries = 0;
while (retries < 5)
{
Thread.Sleep(150);
if (mySerialPort.BytesToRead > 0) break;
retries++;
}
}
while (mySerialPort.BytesToRead > 0)
{
byte[] buffer = new byte[mySerialPort.BytesToRead];
int numRead = mySerialPort.Read(buffer,0, buffer.Length);
if (numRead != 0)
result.Append(Encoding.ASCII.GetString(buffer, 0, numRead));
else
break;
Thread.Sleep(150);
}
return result.ToString();
}
catch (TimeoutException)
{
return "";
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
Hocam çok teşekkürler