stm32 ile C# da usb baglanti sorunu

Başlatan cebeci52, 12 Ağustos 2014, 22:08:09

cebeci52

stm32f4 ile C# da usb ile baglanti yapabilen varsa yardım edebilir mi

EMP_Otto

Sorunun tam olarak nedir?Kodlarını paylas görelim,yardımcı olalım
Bu işler zordur,özveri ister...

cebeci52




C# üzerinden usb baglantı ile stm32f4 üzerindeki ledlari yakmak ve söndürmek istiyorum. fakat baglan butonuna basınca baglanti kurmuyor.

trinity

stm32 programındaki ID değerlerinin programdakiyle aynı olduğuna emin misiniz?

cebeci52

eminim vıd ve pıd degerleri dogru kodlarda sıkıntı var diye düşünüyorum baglan butonuna basınca donup kalıyoo program

barisertekin

Soruyu soralı 2 gün geçmiş. Yazdığınız kodu paylaşsaydınız hemen hatayı söylerdik ve iş biterdi. Nasıl bir yardım bekliyorsunuz?

trinity

Programlar uyumsuz. İkisini farklı yerlerden aldıysan tutmayabilir. Başka örneklere bak.

cebeci52

C# komutları tamamen bu şekilde. ekran görüntüsü üst taraftaki gibi baglan butonuna basınca donup kalıyo program sorun nerde bulamadı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.Globalization;
using USBManagement;
using System.Threading;
using System.Diagnostics;


namespace PC_USB
{

    public partial class Form1 : Form
    {
       
        //********************************************************************
        //********************************************************************
        //********************************************************************

        #region kurulum
        UsbHidDevice my_hid = new UsbHidDevice();
        short VendorID;
        short ProductID;
       
        int pb1 = 0, pb2 = 0, pb3 = 0, pb4 = 0;
        char veri1='k',veri2='k',veri3='k',veri4='k',veri5='x';

        byte[] gidecek_buffer = new byte[64];
        byte[] gelen_buffer = new byte[64];

        public Form1()
        {
            InitializeComponent();
            my_hid.DeviceStateChanged += new DeviceStateChangeEventHandler(OnChangeDeviceState);           
        }


        private void Form1_Load(object sender, EventArgs e)
        {
                   
            label1.Visible = false;
            label2.Visible = false;
            label2.Text = "0";
            textBox1.Text = "1234";
            textBox2.Text = "0001";
            pictureBox1.ImageLocation = "2.png";
            pictureBox2.ImageLocation = "2.png";
            pictureBox3.ImageLocation = "2.png";
            pictureBox4.ImageLocation = "2.png";
        }
       
        #endregion kurulum

        //********************************************************************
        //********************************************************************
        //********************************************************************

        #region durumlar
        private void OnChangeDeviceState(object sender, DeviceStateChangeEventArgs e)// Cihazın bağlantısı ile ilgili durumlar değiştiğinde...
        {
            if (e.CurrentState == DeviceState.Opened)
            {
                label1.Text = "Cihaza Bağlanıldı!";
                //Debug.WriteLine("Device State Changed!! Curren State : Opened");
            }
            else if (e.CurrentState == DeviceState.Closed)
            {
                label1.Text = "Cihaza bağlantı Kesildi!";
                //Debug.WriteLine("Device State Changed!! Curren State : Closed");
            }
            else if (e.CurrentState == DeviceState.Waiting)
            {
                label1.Text = "Cihaz Beklemede!";
                //Debug.WriteLine("Device State Changed!! Curren State : Waiting");
            }
            else if (e.CurrentState == DeviceState.Ready)
            {
                label1.Text = "Cihaz Hazır";
                //Debug.WriteLine("Device State Changed!! Curren State : Ready");
            }
            else
            {
                label1.Text = "Cihaz Durumu Bilinmiyor!";
                //Debug.WriteLine("Device State Changed!! Curren State : None");
            }
        }       
        #endregion durumlar

        //********************************************************************
        //********************************************************************
        //********************************************************************

        #region olaylar olaylar
        void veri_gonder()
        {
            if (my_hid.IsOpen)
            {
                gidecek_buffer[0] = Convert.ToByte(veri1);
                gidecek_buffer[1] = Convert.ToByte(veri2);
                gidecek_buffer[2] = Convert.ToByte(veri3);
                gidecek_buffer[3] = Convert.ToByte(veri4);
                gidecek_buffer[4] = Convert.ToByte(veri5);

             //   if (my_hid.IsWindowsXpOrLater) // eğer win xp'den önceki bir sürüm var ise control, win xp veya sonraki bir sürüm var ise interrupt kullanılır..
               //     my_hid.WritePipe(gidecek_buffer, TransactionType.Interrupt);// gönderme işi burada yapılıyor..
             
                    my_hid.WritePipe(gidecek_buffer, TransactionType.Interrupt);
                   
             
             
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pb1++;
            if (pb1 == 1)
            {
                pictureBox1.ImageLocation = "1.png";
                veri1='a';               
            }

            if (pb1 == 2)
            {
                pictureBox1.ImageLocation = "2.png";
                veri1='k';
                pb1 = 0;
            }
            veri5 = 'x';
            veri_gonder();
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            pb2++;
            if (pb2 == 1)
            {
                pictureBox2.ImageLocation = "1.png";
                veri2='a';
            }

            if (pb2 == 2)
            {
                pictureBox2.ImageLocation = "2.png";
                veri2='k';
                pb2 = 0;
            }
            veri5 = 'x';
            veri_gonder();
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {
            pb3++;
            if (pb3 == 1)
            {
                pictureBox3.ImageLocation = "1.png";
                veri3='a';
            }

            if (pb3 == 2)
            {
                pictureBox3.ImageLocation = "2.png";
                veri3='k';
                pb3 = 0;
            }
            veri5 = 'x';
            veri_gonder();
        }

        private void pictureBox4_Click(object sender, EventArgs e)
        {
            pb4++;
            if (pb4 == 1)
            {
                pictureBox4.ImageLocation = "1.png";
                veri4='a';
            }

            if (pb4 == 2)
            {
                pictureBox4.ImageLocation = "2.png";
                veri4='k';
                pb4 = 0;
            }
            veri5 = 'x';
            veri_gonder();
        }

        private void button1_Click_1(object sender, EventArgs e) //bağlan
        {
            if (!my_hid.IsOpen)
            {
                if (textBox1.TextLength > 0 && textBox2.TextLength > 0)
                {
                    VendorID = short.Parse(textBox1.Text, NumberStyles.HexNumber);
                    ProductID = short.Parse(textBox2.Text, NumberStyles.HexNumber);
                }

                if (my_hid.OpenPipe(VendorID, ProductID))
                {
                    label1.Visible = true;
                    timer1.Enabled = true;
                    label2.Visible = true;
                    button1.Enabled = false ;
                    button2.Enabled = true;
                    groupBox1.Enabled = true;
                }
                else MessageBox.Show(" Hatalı VendorID ve/veya ProductID !");
            }

        }

     
        private void button2_Click_1(object sender, EventArgs e)//bağlantıyı kes
        {

            if (my_hid.IsOpen)
            {
                my_hid.ClosePipe();
                timer1.Enabled = false;
                button1.Enabled = true;
                button2.Enabled = false;
                groupBox1.Enabled = false;
            }
        }

        private void timer1_Tick(object sender, EventArgs e) // 10ms'de bir veri al.
        {
            veri5 = 'o'; //ilk önce okuma yapılacağını bildiren veriyi gönder.
            veri_gonder();

            if (my_hid.IsWindowsXpOrLater)          // Burada okuma yapılıyor
                my_hid.ReadPipe(ref gelen_buffer, 64, TransactionType.Interrupt);
            else
                my_hid.ReadPipe(ref gelen_buffer, 64, TransactionType.Control);

            label2.Text = Convert.ToString(gelen_buffer[1]); // gelen veri, gelen_buffer dizisinin 1. elemanından itibarendir.
        }
        #endregion olaylar olaylar
 

       
        //********************************************************************
        //********************************************************************
        //********************************************************************



    }
}

trinity

#8
        private void button1_Click_1(object sender, EventArgs e) //bağlan
        {
            if (!my_hid.IsOpen)
            {
                if (textBox1.TextLength > 0 && textBox2.TextLength > 0)
                {
                    VendorID = short.Parse(textBox1.Text, NumberStyles.HexNumber);
                    ProductID = short.Parse(textBox2.Text, NumberStyles.HexNumber);
                }

                if (my_hid.OpenPipe(VendorID, ProductID))
                {
                    label1.Visible = true;
                    label2.Visible = true;
                    button1.Enabled = false ;
                    button2.Enabled = true;
                    groupBox1.Enabled = true;

                   MessageBox.Show("Aygıt bağlı. Veri bekleniyor...");

                   veri5 = 'o'; //ilk önce okuma yapılacağını bildiren veriyi gönder.
                   veri_gonder();

                   System.Threading.Thread tryRead = new System.Threading.Thread(new System.Threading.ThreadStart(VeriBekle));
                   tryRead.Start();

                }
                else MessageBox.Show(" Hatalı VendorID ve/veya ProductID !");
            }

        }

// Bu iki fonksiyonuda programa ekle
void VeriBekle()
{
    bool dataReceived = false;
    while (!dataReceived)
    {
        if (my_hid.IsOpen)
        {
            dataReceived = my_hid.ReadPipe(ref gelen_buffer, 64, TransactionType.Interrupt); 
            // XP öncesi kullanmadığınızı tahmin ediyorum...
        }
    }

    label2.Text = Convert.ToString(gelen_buffer[1]); // gelen veri, gelen_buffer dizisinin 1. elemanından itibarendir.
}

protected override void WndProc(ref Message m)
{
    my_hid.ProcessDeviceMessage(m);
    base.WndProc(ref m);
}


Button click kısmını bu şekilde bir dene, timer1 kullanmazsan donma olmaz.

cebeci52

valla dediğinin aynısını yaptım şu hatayı verdi




stm32f4 ün arm kodları da şu şekilde yardımcı olursan sevinirim.

char cnt;
char kk;
char readbuff[64];
char writebuff[64];
char sayi=0;
unsigned long int i=0;
void main(void){
NVIC_IntEnable(IVT_INT_OTG_FS);
HID_Enable(&readbuff,&writebuff);
GPIO_Digital_Output(&GPIOD_BASE,_GPIO_PINMASK_12|_GPIO_PINMASK_13|_GPIO_PINMASK_14|_GPIO_PINMASK_15);
while(1){
kk=HID_Read();
{
if(readbuff[0]=='a')GPIOD_ODR.B12=1;
if(readbuff[0]=='k')GPIOD_ODR.B12=0;
if(readbuff[1]=='a')GPIOD_ODR.B13=1;
if(readbuff[1]=='k')GPIOD_ODR.B13=0;
if(readbuff[2]=='a')GPIOD_ODR.B14=1;
if(readbuff[2]=='k')GPIOD_ODR.B14=0;
if(readbuff[3]=='a')GPIOD_ODR.B15=1;
if(readbuff[3]=='k')GPIOD_ODR.B15=0;

if(readbuff[4]=='o')
  {
  sayi.f0=GPIOD_ODR.B12;
  sayi.f1=GPIOD_ODR.B13;
  sayi.f2=GPIOD_ODR.B14;
  sayi.f3=GPIOD_ODR.B15;
  writebuff[0]=sayi;
  HID_Write(&writebuff,64);
  readbuff[4]='0';
  }
  }
  }
  }
   void USB_kesmesi() iv IVT_INT_OTG_FS ics ICS_AUTO
   {
   USB_Interrupt_Proc();
   }
 


LukeSkywalker

Siz kite ikinci usb kabloyu da bagliyor musunuz? Kite mikrousb kabloyu da takmalisiniz.

trinity

Stm32 gelen veriyi artık VeriBekle() fonksiyonuyla alıyoruz, timer1 kullanma. timer1 10ms arayla veri okumaya çalıştığı için donmaya sebep oluyor.

cebeci52

iki usb kablosuda baglı şu an verdiği hata şu şekilde. Veri bekleniyor diyor bekliyoruz hiç bişey gelmiyor tamam butonunna basınca resimdeki hatayı veriyor. timer1 i de kaldırdım.






barisertekin

#13
Kendi yazdığınız windows uygulaması yerine çalışan bir program ile deneyin bakalım çalışacak mı?
Hatanın hangi tarafta olduğunu tespit etmiş olursunuz. Belki sorun STM32'nin veri gönderemiyor oluşudur.

cebeci52

denedim hiç biri çalışmıyo sorun nerde cözemedim kitaptan çalışan uygulama bu bende calışmıyorr