c# seri port ile motor kontrolü

Başlatan selimiii, 09 Nisan 2012, 21:02:19

selimiii

Merhaba arkadaşlar, seri port aracılığı ile fırçasız dc motor sürmek istiyorum.
Temel mantık şu, 3 tane süre textbox'ı 3 tanede hız text box'ı var. Değerler girilip gönder butonuna basıldığında, ilk süre ve hız değerleri string olarak birleştirilip işlemciye gönderilecek. İşlemciden OK onayı geri göndüğünde ikinci değer gönderilecek ve motor ilk belirlenen sürede döndükten sonra ikinci belirlenen sürede istenen hızda dönmeye başlyacak. Üçüncü süre ve hız değerleri içinde temel mantık aynı. Ama bir türlü çalıştıramadım. Size kodlarıda atayım;

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;

namespace SeriPortOkuma
{
    public partial class Form1 : Form
    {

        SerialPort SeriPortum;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
          
            SeriPortum = new SerialPort();
            SeriPortum.PortName = "COM1";
            SeriPortum.Parity = Parity.None;
            SeriPortum.BaudRate = 115200;
            SeriPortum.DataBits = 8;
            SeriPortum.StopBits = StopBits.One;


            
         }

        private void gonder_Click(object sender, EventArgs e)
        {
            try
            {
                if (SeriPortum.IsOpen == false)  //Seri port açık değilse seri port açılıyor
                {
                    SeriPortum.Open();           //Seri porttan veri iletişimi böylece başlamış oluyor   
                }
            }
            catch
            {
                MessageBox.Show("Bağlantı kurulamadı! Lütfen girdiğiniz port değerlerini kontrol edin:" + SeriPortum.PortName.ToString() + "," + SeriPortum.BaudRate.ToString());
                return;
            }
            textBox1.Text = SeriPortum.ReadLine().ToString();
            string ilkDeger ="T" + sure1.Text + "F" + hiz1.Text + "\r";
            SeriPortum.WriteLine(ilkDeger);




            while (SeriPortum.ReadLine().ToString() != "OK");

                    string ikinciDeger = "T" + sure2.Text + "F" + hiz2.Text + "\r";
                    SeriPortum.WriteLine(ikinciDeger);
            
            while (SeriPortum.ReadLine().ToString() != "OK");

                    string ucuncuDeger = "T" + sure3.Text + "F" + hiz3.Text + "\r";
                    SeriPortum.WriteLine(ucuncuDeger);

        }
  

    }
}

kudretuzuner

Merhaba
C# bilmiyorum programınıza yorum yapamayacağım.PIC tarafındaki yazılım PC tarafındaki yazılım ile uyum sağlıyor mu?
Amatör

selimiii

Alıntı yapılan: kudretuzuner - 09 Nisan 2012, 21:15:35
Merhaba
C# bilmiyorum programınıza yorum yapamayacağım.PIC tarafındaki yazılım PC tarafındaki yazılım ile uyum sağlıyor mu?

Sağlıyor hocam. Zaten tek bir hız ve süre değeri ile döndürmeye çalıştığımızda motor dönüyor. Sorun, ikinci hız ve süre değerini döndürmede. Şöyle söyleyeyim  motora 10 saniye 500 rpm de, 5 saniye 2000 rpmde dön dedik, diyoruz motor dönmeye başlıyor, 10 saniye 500 de döndükten sonra hızlanarak 2000 rpme çıkıyor ve 5 saniye 2000 rpmde dönüyor. Olması gereken bu anlattığım olay. Hyperterminalde de yaptık bunu ama c# ta yapamıyoruz

yamak

Seri porttan okuma işini data_received event inin içinde yapmalısın.Birde okumaya harf harf yap. Yani FSM mantığına göre yap.Switch case kullanarak ilk olarak o harfi nin gelmesini bekle o harfi gelince state durumunu değiştir 'K' harfini bekle sonra 'K' harfi de gelince yaptırman gerekeni yaptır.Bir de ReadExisting() metodunu kullanmanı tavsiye ederim.

kudretuzuner

Merhaba
Ben de onu sormuştum.İlk işlemde çalışan programda ikinci işlem için PIC'in algılaması gereken yazılımın da olması gerekli özetle PIC'teki yazılım tek bir komuta cevap verecek şekilde tasarlanmış ise(yazılmışsa)ikinci gelen komutu algılayamaz.Ama siz tek bir komutla(WriteLine)olarak string yolluyorsanız bu string bilgisinin(ASCII hex olarak)PIC nasıl algılayacak?Bu sebepten her bir işlem için ayrı ayrı komutları seriporttan yollarsanız daha pratik olur sanırım.
Amatör

selimiii

Tamamdır arkadaşlar, sorunu , biraz kod değişikliği ile çözdüm. Readline() ile okumaya çalıştığım için "OK" yerine "OK\r" yazmam gerekiyormuş. Kodları paylaşayım belki bir arkadaşa bir faydası dokunur.

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;

namespace SeriPortOkuma
{
    public partial class Form1 : Form
    {

        SerialPort SeriPortum;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
          
            SeriPortum = new SerialPort();
            SeriPortum.PortName = "COM1";
            SeriPortum.Parity = Parity.None;
            SeriPortum.BaudRate = 115200;
            SeriPortum.DataBits = 8;
            SeriPortum.StopBits = StopBits.One;


            
         }

        private void gonder_Click(object sender, EventArgs e)
        {
            try
            {
                if (SeriPortum.IsOpen == false)  //Seri port açık değilse seri port açılıyor
                {
                    SeriPortum.Open();           //Seri porttan veri iletişimi böylece başlamış oluyor   
                }
            }
            catch
            {
                MessageBox.Show("Bağlantı kurulamadı! Lütfen girdiğiniz port değerlerini kontrol edin:" + SeriPortum.PortName.ToString() + "," + SeriPortum.BaudRate.ToString());
                return;
            }
            
            
            string ilkDeger ="T" + sure1.Text + "F" + hiz1.Text + "\r";
            SeriPortum.WriteLine(ilkDeger);
            while (SeriPortum.ReadLine() != "OK\r") ; 
            string ikinciDeger = "T" + sure2.Text + "F" + hiz2.Text + "\r";
            SeriPortum.WriteLine(ikinciDeger);
            while (SeriPortum.ReadLine() != "OK\r") ;
            string ucuncuDeger = "T" + sure3.Text + "F" + hiz3.Text + "\r";
            SeriPortum.WriteLine(ucuncuDeger);


        }

    }
}

cemilkendir

baudrate hızın çok yüksek değilmi böyle bir iş için pic olarak ne kullanıyorsun
bence hızı düşürmen daha sağlıklı çalışmasını sağlar hatalı veri açısından felan

pathetic

Sorunu çözmüşsün ama bence daha sağlıklı bir program olması açısında while ile bekletmek yerine bir durum değişkeni tanımla. O durum değişkenini datareceived eventi içinde "OK" gelince işleme sok. Hangi durumda isen onla ilgili bir sonraki komutunu gönder.
Ayrıca "OK" yerine tanımladığın özel tek bir karakter ile de işlem yapabilirsin bence.
Kolay gelsin.

selimiii

Alıntı yapılan: cemilkendir - 10 Nisan 2012, 00:32:48
baudrate hızın çok yüksek değilmi böyle bir iş için pic olarak ne kullanıyorsun
bence hızı düşürmen daha sağlıklı çalışmasını sağlar hatalı veri açısından felan
dsPIC 30f3010 kullandım hocam.

@pathetic, ilk aşamada önemli olan istediğimi işlemi yapabilmekti hocam. söylediklerinizi geniş bir zamanımda deneyeceğim, sağolun