Merhaba arkadaşlar, Bir seri port haberleşmeli terazim var. Putty ile veri alabiliyorum. C# ile Arduino için daha önceden yapmış olduğum bir arayüzüm vardı ordan da veri okuyabiliyorum. Fakat çok sağlıklı olmadığı için bir kaç düzenleme yaptım ama çözemediğim ve önerilerinizi beklediğim bir kaç sorun ortaya çıktı.
1-) Data'yı timer ile alıyorum. Terazi 9600 baudda çok hızlı gönderiyor ölçtüğü ağırlığı. Bu yüzden daha önceden,
sonuc = serialPort1.ReadExisting();
olan komutu
sonuc = serialPort1.ReadLine();
olarak çevirdim.
Timer Interval süresini 200ms ve daha yukarısı yaptığımda terazi verileri düzgün gelmiyor, geç kalıyor sanki kasıyormuş gibi. Süreyi 5-75 ms civarı yaptığımda da veri tam istediğim gibi geliyor fakat bu sefer de arayüzdeki hiçbir butonu kullanamıyorum, "bağlantıyı kopar" butonum var basıyorum işlemiyor, 20-30 sn sonra işliyor.
2-) Terazinin gönderdiği data "ST,GS, 15.6 g" tarzında geliyor. Sadece sayıyı nasıl çekebilirim. Split modunu tam uygulayamadım. Yardım ederseniz çok sevinirim. Kodlar aşağıda.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.IO;
namespace Data_Okuma { public partial class Form1 : Form { string[] ports = SerialPort.GetPortNames(); public Form1() { InitializeComponent(); }
Şimdi dostum öncelikle timer ın nasıl çalıştığını anlaman lazım. toolboxtaki timer ui threadında çalışıyor. Bu yüzden ui yi meşgul ediyor. Multi threaded asenkron programlamayla felan çok içli dışlı değilim ama senin kullanman gereken şey System.Threading.Timer . Farklı bir threadda çalışacağı için ui yi meşgul etmez sen de istediğin gibi durdurabilirsin. UIde değişiklik yapmak istediğinde hata vericektir. Onun için şuna bakhttp://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c
Thread t = new Thread(new ThreadStart(fonksiyonAdi));
şeklinde threadleri kurduktan sonra,
t.Start();
şeklinde başlatırsın. Threadler çok önemli bir kod bloğunda aynı anda bulunmasın diye de kilit mekanizmasını kullanırsın:
object kilit=new object;
lock(kilit) { calisiyorTmp = calisiyor; // yapılması gerekenleri burada yaparsın, aynı anda sadece bir thread burada bulunabilir Monitor.PulseAll(kilit); // gerekirse, burayı bekleyen diğer threadlere işaret gönderir(bekleyen varsa uyandırır) Monitor.Wait(kilit); // gerekirse, bu threadi uyutur ki boş çalışmasın, işlemci yükü oluşturmasın gereksiz şekilde.
Çok teşekkür ederim. Okuma sorununu " private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) " ve readtimeout kullanarak çözdüm. Split için de timer için de teşekkür ederim. :)
Bu Tiip durumlarda System.Threading.Timer kullanmak kesin çözüm. UI üstündeki timer belirli bir zaman sonra sıkıntı yaratmaya başlıyor. Uygulama Açık kalma süresi ortalama 20 günü geçtiğinde, o yüzden System.Threading.Timer kullanmak gerekir. RS232 gibi bağlantı seçeneklerinde, sunucu dan cevap beklerden vs.
Bir seri port haberleşmeli terazim var. Putty ile veri alabiliyorum. C# ile Arduino için daha önceden yapmış olduğum bir arayüzüm vardı ordan da veri okuyabiliyorum. Fakat çok sağlıklı olmadığı için bir kaç düzenleme yaptım ama çözemediğim ve önerilerinizi beklediğim bir kaç sorun ortaya çıktı.
1-) Data'yı timer ile alıyorum. Terazi 9600 baudda çok hızlı gönderiyor ölçtüğü ağırlığı.
Bu yüzden daha önceden,
olan komutu
olarak çevirdim.
Timer Interval süresini 200ms ve daha yukarısı yaptığımda terazi verileri düzgün gelmiyor, geç kalıyor sanki kasıyormuş gibi.
Süreyi 5-75 ms civarı yaptığımda da veri tam istediğim gibi geliyor fakat bu sefer de arayüzdeki hiçbir butonu kullanamıyorum, "bağlantıyı kopar" butonum var basıyorum işlemiyor, 20-30 sn sonra işliyor.
2-) Terazinin gönderdiği data
"ST,GS, 15.6 g" tarzında geliyor. Sadece sayıyı nasıl çekebilirim. Split modunu tam uygulayamadım. Yardım ederseniz çok sevinirim. Kodlar aşağıda.
< Resime gitmek için tıklayın >
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.