C# datareceived event'i sorunu

Başlatan Ali_54, 10 Kasım 2011, 12:17:06

Ali_54

c# rs232 ile ilgili konular açılmmış, ancak receieve olayı ile ilgili kod paylaşan görmedim. gönderme olayını yapabiliyorum. ancak, veri alma olayı için datareceived nesnesini kullanmak gerekiyormuş. kesme gibi çalışan bu event le ilgili veri alma kodu paylaşabilir misiniz? form uygulaması için. mesela veriyi alıp textboxa, değişkene yada listbox a aktarmak gibi.
1 harf öğretenin 4 gün kölesi olurum.

kudretuzuner

Merhaba
C# bilmiyorum ama VB.net ile kodlar böyle belki işinize yarar. 
   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'  yani  hex 31  klavye rakkam"1"
            gelen="1"
            textbox1.text="1"
        End If
    End Sub

http://www.table-ascii.com/
Amatör

since1990

Arkadaşım bende çok uğraştım aynı olayla sonradan bi arkadaşımdan yardım aldım ve olayı çözdüm ;)
Şöyle yapacaksın, yani ben öyle yaptım;
design penceresi varya hani buton falan ekleyebildiğin yer, işte oraya gelip toolboxtan serial port ekle pencerene.

Sonra serialport yazısına tıkla sağ tarafta açılan pencereden seriportun adını com noktasını baud rateini belirle. Sonra o pencerenin az yukarısında şimşek işareti(events) var, ona tıkla
http://
ondan sonra açılan pencereden datareceievede çift tıkla açılankod aralığına data gelince ne yapacağını yaz.
http://
Örneğin gelen datayı yakalamak için,
        private void seriport_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] buffer;
            buffer = new byte[1];  // 
            seriport.Read(buffer, 0, 1);
//buffer gelen sayıya eşit oluyor ordan istediğin matrise kaydet istediğini yap ;)
        }

Not: Portu açmayı unutma;)
if (!seriport.IsOpen)
                    { seriport.Open(); }
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

Ali_54

ÇOK TEŞEKKÜR EDERİM. datareceive bölümü işleme girmeye başladı. ancak byte olarak aldığımız şeyleri stringe çevirip texboxa aktaramadım. c# değişkenlerine aşına değilim. text boxa kadar nasıl aşıyabilirim gelen bilgiyi?

şöyle denedim:
byte[] buffer;
            buffer = new byte[1];  // 
            serialPort1.Read(buffer,0,1);
            string s = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
           textBox1.Text= s;


1 harf öğretenin 4 gün kölesi olurum.

justice_for_all

 textBox1.Text= buffer[0].tostring();

tostring te hata verecek buffer[0] yazip noktaya basinca tostring yazar onu tikla...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Ali_54

tamam. yazımı düzeltip te denedim dediğiniz gibi.  ama çalışırken yine hata verdi.
1 harf öğretenin 4 gün kölesi olurum.

justice_for_all

ne hatasi verdi hocam?visual studio icinde debug yaparak mi calistiriyosunuz yoksa programin exe sinden mi calistiriyosunuz?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

RcALTIN

Alıntı yapılan: Ali_54 - 11 Kasım 2011, 14:51:05
tamam. yazımı düzeltip te denedim dediğiniz gibi.  ama çalışırken yine hata verdi.

textbox'a atarken "çapraz iş parçacığından erişim bla bla" diyor di mi? ya bir delegate yazıp, texboxu invoke edeceksin yada form ctor veya load eventi bloklarından birine
CheckForIllegalCrossThreadCalls = false;
yazacaksın.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

justice_for_all

Alıntı yapılan: RcALTIN - 11 Kasım 2011, 15:17:03
textbox'a atarken "çapraz iş parçacığından erişim bla bla" diyor di mi? ya bir delegate yazıp, texboxu invoke edeceksin yada form ctor veya load eventi bloklarından birine
CheckForIllegalCrossThreadCalls = false;
yazacaksın.

Direkt olarak derlediginiz projenin exe sinden calistirirsaniz da oyle bi hata vermez egerki debug yapmicaksaniz
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

RcALTIN

Alıntı yapılan: justice_for_all - 11 Kasım 2011, 15:27:13
Direkt olarak derlediginiz projenin exe sinden calistirirsaniz da oyle bi hata vermez egerki debug yapmicaksaniz

doğru ama debugdan mahrum kalmaya gerek yok...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

Ali_54


direk run dan (f5 ten) çalıştırıyorum
verdiği hata kutucuk içinde şöyle:

başlığı: invalid operation exception was unhandled
msjı ie: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

hata olark işarelediği satır: textBox1.Text = buffer[0].ToString();

kodun tamamı:
  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;

namespace seri_iletişim_read_send
{
    public partial class Form1 : Form
    {   
        public Form1()
        {
            InitializeComponent();
        }

        private void seriport_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] buffer;
            buffer = new byte[1];  // 
            serialPort1.Read(buffer,0,1);
            string s = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
            textBox1.Text = buffer[0].ToString();   // veri geldiği zaman hata verdği satır. gelen veriyi textbox ta göstermek istemiştim. :(
                    
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen  // port kapalı ise aç
            { serialPort1.Open(); }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string a="aa";  // şu an amaçsız
            
            
        }

   
    }
}

1 harf öğretenin 4 gün kölesi olurum.

Ali_54

tabi orada
string s = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
satırı amaçsz kamış şu an
1 harf öğretenin 4 gün kölesi olurum.

RcALTIN

debug yapıyorsunuz ve iki üst mesajımda bahsettiğim durum oluşuyor, çözümünüde o mesajda belirtmiştim.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

lojikmemo1

Merhaba

Verdiğin kodu derledim bende sorun çıkmadı. Proje dosyasını verirsen onun üzerinde bakabilirim.
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.

Ali_54

anladım. saçma bişey ama debug da hata verip exe sinin çalışması. garıp geldi.
her neyse şöyle bi yol buldum ve bu çalışıyor.
 
string k;
k=serialport1.readexiting(); deyince oldu. ordan istediğim gibi kullanabikiyorum. ilgilenen herkese teşekkür ederim arkadaşlar. 
datareceive eventinde tek satırlık kod işi bittirdi :)
1 harf öğretenin 4 gün kölesi olurum.