USB Devresinde termometre cıkarıp takınca C# arayüzü resetlemek gerekiyor

Başlatan baran123, 22 Temmuz 2014, 02:32:43

baran123

Merhaba baslık uzun oldu galıba Mucit23 hocamın bir projesini yapıyorum fakat bir iki takıldığım nokta var

Devreyi proteusda deniyorum !

1) Termometre calısıyor c#arayüzüde ama poteus programını durdurup calıstırınca pc arayüzünü yeniden acmak gerekiyor bunu nasıl cozerım acmadan tekrar devam etsin istiyorum

2)Sürekli bağlantı kurulamadı diyor ama sıcaklıkda bır sorun yok kodlar assagıda yardımcı olursanız cok makbule gecer iyi çalışmalar

c# arayüz

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 UsbLibrary;

namespace USB_Termometre
{
    public partial class Main : Form
    {
        byte[] RecievedData = new byte[65];
        byte Tam = 0;
        byte Onda = 0;
        bool durum = false;
        public Main()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            this.usbHidPort1.ProductId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber);
            this.usbHidPort1.VendorId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber);
            usbHidPort1.CheckDevicePresent();
            if (durum)
            {
               toolStripStatusLabel1.ForeColor = Color.Green;
               toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu";
            }
            else
            {
              toolStripStatusLabel1.ForeColor = Color.Red;
              toolStripStatusLabel1.Text = "USB Bağlantısı Bekleniyor";
            }
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            usbHidPort1.RegisterHandle(Handle);
        }
        protected override void WndProc(ref Message m)
        {
            usbHidPort1.ParseMessages(ref m);
            base.WndProc(ref m);
        }
        private void usbHidPort1_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            if (InvokeRequired)
            {
                try
                {
                    Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new object[] { sender, args });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            else
            {
                RecievedData = args.data;
                Tam = RecievedData[2];
                Onda = RecievedData[3];
                label2.Text = "Sıcaklık : " + Tam.ToString() + "," + Onda.ToString() + "°C";
            }
        }

        private void usbHidPort1_OnDataSend(object sender, EventArgs e)
        {
            
        }

        private void usbHidPort1_OnDeviceArrived(object sender, EventArgs e)
        {
          
        }

        private void usbHidPort1_OnDeviceRemoved(object sender, EventArgs e)
        {

        }

        private void usbHidPort1_OnSpecifiedDeviceArrived(object sender, EventArgs e)
        {
            toolStripStatusLabel1.ForeColor = Color.Green;
            toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu";
            durum = true;
        }  
        private void usbHidPort1_OnSpecifiedDeviceRemoved(object sender, EventArgs e)
        {
            toolStripStatusLabel1.ForeColor = Color.Red;
            toolStripStatusLabel1.Text = "USB Bağlantısı kesildi";
            label2.Text = "Sıcaklık : --,-°C";
            durum = false;
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Çıkış yapmak istediğinizden emin misiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (result == DialogResult.Yes)
            {
                Environment.Exit(1);
            }
        }    
    }
}


CCS C

#include <18F4550.h>
#device ADC=10
#fuses xtPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOBROWNOUT // 8MHZ
#use delay(clock=4MHZ)

#define USB_HID_DEVICE     TRUE             
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT    //Uçnokta1'de Kesme transferi aktif
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT    
#define USB_EP1_TX_SIZE    64                      //Uçnokta1 için maksimum alınacak ve gonderilecek
#define USB_EP1_RX_SIZE    64 

#include <pic18_usb.h>     
#include <USB_Driver.h>                            //USB konfigurasyon bilgileri bu dosyadadır.
#include <usb.c>
#include <lcd_driver.c>
#include <ds18b20.c>

#use fast_io(b)
#use fast_io(c)

#define UcNokta1  1 

unsigned int16 Term;
unsigned int8 paket[64];
unsigned int8 Tam,Onda;
float Sicaklik;

void main()
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   
   lcd_init();
   
   printf(lcd_putc,"\f");
   printf(lcd_putc,"USB Baglantisi \nBekleniyor");
   delay_ms(100);
   
   usb_init();                      
   usb_task();                    
   usb_wait_for_enumeration();
   
   if(usb_enumerated())    
   {
      printf(lcd_putc, "\f");
      printf(lcd_putc, "Baglanti Kuruldu");
      lcd_gotoxy(1,2);
      printf(lcd_putc, "DS18B20 Okunuyor");
      Sicaklik = ds1820_read();
      printf(lcd_putc, "\f");
   }
   
   while(TRUE)
   {  
      while(usb_enumerated())
      {
         if (usb_kbhit(1))       //Eğer pc'den yeni bir paket geldiyse
         {           
            usb_get_packet(UcNokta1, paket, 64); //paketi oku    
            output_high(pin_a0);
         }
         
         lcd_gotoxy(1,2); 
         printf(lcd_putc,"SICAKLIK=%3.1f", Sicaklik); 
         lcd_putc(223); 
         lcd_putc("C  ");
         
         Term = Sicaklik * 10;
         Tam = Term / 10;
         Onda = Term % 10;
         
         paket[1] = Tam;
         paket[2] = Onda;
         
         usb_put_packet(UcNokta1, paket, 64, USB_DTS_TOGGLE); // Datayı Gönder..
         Sicaklik = ds1820_read();
      }
      
      Sicaklik = ds1820_read();
      printf(lcd_putc, "sicaklik = %f", Sicaklik);
   }
}

Recep METE

Arkadaşım bende bu devre üzerinde çalışmak istiyorum.Ancak ne lcd den nede c# arayüzünden bir veri alamadım.Nedendir acaba?
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

USB uygulamalarını yapmak ıın once bır led yak mantıgı anla sonra ılele kod paylasman mumkun ıse yardımcı olurum
not : bu arada proteusda usb uygulamaları yamak için proteusun usb eklentisini kurman lazım virtual usb diye

mesaj birleştirme:: 23 Temmuz 2014, 08:19:43

yardım edecek biri yok mu  :'(

erpay

C# kısmında bağlantı kesilirse tekrar bağlantı var mı yok mu dinlemeye döndürebilirsin programı.

baran123


erpay

C# konusunda yetkin değilim ben de, genelde başkalarının kodlarını düzenleyerek hallettim o kısmı. Bilgili kimseler çıkacaktır forumda.

baran123

Yinede çok teşekkür ederim :) bir sürü konu açtım farklı şekillerde falan ama daha çıt yok inşallah biri yardımcı olur belkide çok basit bir şey salaklığıma geliyor fark edemiyorum.

Burak B

Kodun biryerinde süreci blokluyorsun bu nedenle yazılım kilitleniyor. Bu bloklama firmware içerisinde(sensör okuma, v.s.) ve PC tarafında (USB data okuma) olabilir. Haberleşmenin asenkron olduğundan emin olmalısın. Hiçbir kontrol sonsuza kadar beklemez beklerse sistem durur.

Bir diğer konuda eğer usb kütüphanen event oluşturmak için thread kullanıyorsa bu eventların içerisinde UI bileşenlerine erişim şeklini gözden geçirmeni gerektirir. Aksi halde exception oluşur.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle