Arkadaşlar C# ile pic ve usb çalışması yapıyorum. şimdi sorum şu. Picten C#'a veri gelecek. Ama veri her an gelebilir. kullanıcıya bağlı istediği zaman veriyi gönderebilir. C# dada öyle bir komut olmalı ki bir yandan buton muton işleri yaparken bir yandan picten veriyi beklesin ve veri değişimini gördüğü gibi istediğim işlemleri yapsın. Biraz karışık biliyorum ama çok lazım bu komut(varsa) yada kafasında algoritma olanda söyleyebilir.
daha cok calışmanız lazım :D picin donanım ve mimarisine bir göz atın sorularınıza cevap bulacaksınız
Kardeş pic mimarisini biliyorum zaten. Bahsettiğim olayın pic kısmıyla ilgili bir problem yok zaten. c#'da birşeyler yapmam lazım. bir yol bir ip ucu olabilir.
Merhaba
C# bilmiyorum.VB.Net 2008 express edition kullanmaktayım. "SerialPort1_DataReceived "evantına aşağıdaki kod ile,PIC'ten HEX'31' yollandığı zaman formdaki PictureBox1'ın rengini kırmızıya dönüştürebilirsiniz.Kolay gelsin.
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim gelen As String = SerialPort1.ReadByte
If gelen = 49 Then
PictureBox1.BackColor = Color.Red
End If
End Sub
Event Handler ile yakalayacaksınız. Basit bir şey. Ama hangi USB kütüphanesini kullandığınızı yazmanız lazım. Yada USB DLLsini atın ben hallederim. Yapacağınız şey şuna benzer olacak:
//... İlklendirme metodunda, Formlarda void Form1() olan yere
usbLibrary1.DataReceived += new EventHandler(Usb_DataReceived);
// Olay işleyicisi ise böyle
private void Usb_DataReceived(object sender, (...)EventArgs e)
{
//...
}
usbLibrary1.DataReceived += bunu yazdıktan sonra ( eğer Visual Studio kullanıyorsanız ) iki kez Tab basınca olay otomatik olarak oluşturulur...
Umng.dll Okuma ile kotlar aşağıda aynı sorun bendede var vb.net nasıl yaparız
Imports System.ComponentModel
Imports System.Text
Imports System.Globalization
Imports USBManagement
Imports System.Threading
Public Class Form1
Inherits Form
Private my_hid As New UsbHidDevice()
Private VendorID As Short = Short.Parse("1111", NumberStyles.HexNumber)
Private ProductID As Short = Short.Parse("1111", NumberStyles.HexNumber)
Private my_buffer(63) As Byte
Private gelen_buffer(63) As Byte
Dim Baglanti As Boolean
Dim SiradakiDakika, SiradakiSaat, GonderSayac As Byte
Dim SiradakiUzunDakika, GSuandakiUzunDakika As Integer
Private Sub Oku()
txt_okunan.Text = ""
Do
my_buffer(3) = AscW("o"c)
If my_hid.IsOpen Then
If my_hid.IsWindowsXpOrLater Then
my_hid.WritePipe(my_buffer, TransactionType.Interrupt)
Else
my_hid.WritePipe(my_buffer, TransactionType.Control)
End If
If my_hid.IsWindowsXpOrLater Then
my_hid.ReadPipe(gelen_buffer, 64, TransactionType.Interrupt)
Else
my_hid.ReadPipe(gelen_buffer, 64, TransactionType.Control)
End If
txt_okunan.Text = Convert.ToString(gelen_buffer(2))
End If
Loop
End Sub
https://hotfile.com/dl/172411994/c70ab83/umng.dll.html (https://hotfile.com/dl/172411994/c70ab83/umng.dll.html)
mesaj birleştirme:: 16 Eylül 2012, 21:07:25
Alıntı yapılan: rree - 16 Eylül 2012, 20:03:58
Umng.dll Okuma ile kotlar aşağıda aynı sorun bendede var vb.net nasıl yaparız
Imports System.ComponentModel
Imports System.Text
Imports System.Globalization
Imports USBManagement
Imports System.Threading
Public Class Form1
Inherits Form
Private my_hid As New UsbHidDevice()
Private VendorID As Short = Short.Parse("1111", NumberStyles.HexNumber)
Private ProductID As Short = Short.Parse("1111", NumberStyles.HexNumber)
Private my_buffer(63) As Byte
Private gelen_buffer(63) As Byte
Dim Baglanti As Boolean
Dim SiradakiDakika, SiradakiSaat, GonderSayac As Byte
Dim SiradakiUzunDakika, GSuandakiUzunDakika As Integer
Private Sub Oku()
txt_okunan.Text = ""
Do
my_buffer(3) = AscW("o"c)
If my_hid.IsOpen Then
If my_hid.IsWindowsXpOrLater Then
my_hid.WritePipe(my_buffer, TransactionType.Interrupt)
Else
my_hid.WritePipe(my_buffer, TransactionType.Control)
End If
If my_hid.IsWindowsXpOrLater Then
my_hid.ReadPipe(gelen_buffer, 64, TransactionType.Interrupt)
Else
my_hid.ReadPipe(gelen_buffer, 64, TransactionType.Control)
End If
txt_okunan.Text = Convert.ToString(gelen_buffer(2))
End If
Loop
End Sub
https://hotfile.com/dl/172411994/c70ab83/umng.dll.html (https://hotfile.com/dl/172411994/c70ab83/umng.dll.html)
Ben bu Umng.dll olaylar listesine bilgi geldiğinde bir kesme göremedim. Umng.dll ile olmuyorsa sizin kullandığınız dll ve kotları bizimle paylaşırmısınız.
Fatih kardeş benim kütüphane umng.dll kardeş çok önemli. yazdığın kodlar bu kütüphanede neye denk geliyor?
DLL yi ek olarka gönder. Elindeki kütüphaneyi bilmiyorum...
https://rapidshare.com/files/2935468006/umng.dll
kardes upload ettim rapide dll yi
Önceden elimde kütüphane vardı. Şimdi nedense bulamadım. C# ta Threading biliyorsanız yapmanız gereken şey ayrı bir iş parçacığında sürekli veri okumak. Okuma başarılı oluncaya kadar devam etmek.
C# da böyle:
// Bu en başa
using USBManagement;
//Bu global alana
UsbHidDevice dev = new UsbHidDevice();
const short VendorID = 0x1111;
const short ProductID = 0x1234;
byte[] yaz_tampon = new byte[64];
byte[] oku_tampon = new byte[64];
void BaglanmayiDene()
{
if (dev.OpenPipe(VendorID, ProductID))
{
MessageBox.Show("Aygıt bağlı. Veri bekleniyor...");
System.Threading.Thread tryRead = new System.Threading.Thread(new System.Threading.ThreadStart(VeriBekle));
tryRead.Start();
}
else
{
MessageBox.Show("Aygıt bağlı değil...");
}
}
void VeriBekle()
{
bool dataReceived = false;
while (!dataReceived)
{
if (dev.IsOpen)
{
dataReceived = dev.ReadPipe(ref oku_tampon, 64, TransactionType.Interrupt);
// XP öncesi kullanmadığınızı tahmin ediyorum...
}
}
}
void VeriAlindi()
{
MessageBox.Show("Veri alindi...");
}
protected override void WndProc(ref Message m)
{
dev.ProcessDeviceMessage(m);
base.WndProc(ref m);
}
Bir butonun click olayına da BaglanmayiDene() dersiniz. Bu şekilde yazabildim...
Fatih çok teşekkürler çok yardımcı oldun. Deneyeceğim olmassa bile bir fikir oluştu kafamda. sağolasın
Ben timer bağladım oradan belirli zamanlarda okumada yaptırdım . Kesme olsaydı daha iyi olurdu .
Sonuç Umng nin recever (olay oluşturma) kesmesi görüğüm kadar yok.
Fatih bu senin yazdığın kodlarda gelen veri oku_tampon[ x ] diye mi kullanacağız yoksa dataReceived[ x ] diye mi kullanacağız? Hala tam anlamadım mesela bu yazdığın programda gelen datayı(veri bir sayıdır) messagebox kutusuna yazdıralım. değiştikçe sürekli yenisi yazsın. Bunu nasıl yapabiliriz? bunu yapabilirsem tam çözüm olacak benim için
Arkadaşlar visual studio ile bir program yazarken bir nesnenin (dll vs) özellikleri görmek için object browser kullanılır.
1.kullanacağınız dosyayı add reference den ekleyiniz
2.solution exploler penceresinden "show all files" butonuna tıklayın. (tüm ekli dosyaları görürsünüz)
3.özelliklerini görmek istediğinişz dosyayı ters tıklayarak "view in object browser" diyin
orada zaten özellikler nasıl kullanmanız gerektiğini vs göreceksiniz.
Şuan özellikle işimiz yok zaten algoritma kurmaya çalışıyorum :)
Özellikten Kasıt Hangi olayda hangi kod bloguğunun etkileneceğidir. Ha işiniz yoksa algoritma (buda ne demekse) oluşturmaya bakın.
@muhittin_kaplan merak etme ben sınıfı inceledim public veya private metodların hiçbirinde veri alma sırasında tetiklenen olay yok.
Esas soruya gelince dataReceived sadece bool türü bi değişken. Veri geldiğinde True olacak. Alınan veri ise oku_tampon dizisinde bulunuyor. Zaten veri gelince şöyle bir düzenlemeyle:
// Bu en başa
using USBManagement;
//Bu global alana
UsbHidDevice dev = new UsbHidDevice();
const short VendorID = 0x1111;
const short ProductID = 0x1234;
byte[] yaz_tampon = new byte[64];
byte[] oku_tampon = new byte[64];
void BaglanmayiDene()
{
if (dev.OpenPipe(VendorID, ProductID))
{
MessageBox.Show("Aygıt bağlı. Veri bekleniyor...");
System.Threading.Thread tryRead = new System.Threading.Thread(new System.Threading.ThreadStart(VeriBekle));
tryRead.Start();
}
else
{
MessageBox.Show("Aygıt bağlı değil...");
}
}
void VeriBekle()
{
bool dataReceived = false;
while (!dataReceived)
{
if (dev.IsOpen)
{
dataReceived = dev.ReadPipe(ref oku_tampon, 64, TransactionType.Interrupt);
// XP öncesi kullanmadığınızı tahmin ediyorum...
}
}
VeriAlindi();
}
void VeriAlindi()
{
MessageBox.Show("Veri alindi...");
}
protected override void WndProc(ref Message m)
{
dev.ProcessDeviceMessage(m);
base.WndProc(ref m);
}
Kesme gibi çalışır. Yani veri gelinceye kadar bekler. Veri gelince VeriAlindi metodunu işletir. Eğer veri bekleme devam edecekse Thread nesnesini global tanımlayın ve istediğiniz yerde tekrar Start komutu verin...
Buldum sitedeki devre tam istediğim gibi isis dosyasında bir kaç yer değiştirince çalıştı.
https://320volt.com/pic18f4550-ccs-c-usb-termometre/ (https://320volt.com/pic18f4550-ccs-c-usb-termometre/)
Fatih verdiğin kodlar ve rota tam olarak devremi çalıştırdı :) çok çok çok teşekkür ettim Allah razı olsun kardeş. While(!received) {} bitişine while(received) ekledim tıkır tıkır çalışıyor ;)
Rica ederim. Faydlaı olabildiysem ne mutlu. Allah sizden de razı olsun...