seriport hakkında

Başlatan görkem, 10 Eylül 2017, 00:30:54

görkem

#15
şuanda veri gönderip alabiliyorum fakat ilk 8 byte  gönderdikten sonra 2. 8 byte lık veri anlamsız değerler alıyor  buffer ı sıfırlamama rağmen öyle.

serialPort1.BytesToRead  ile okuduğu değeri nasıl sıfırlayabilirim.

naptıysam buffer sıfırlanmıyor varmı bilen kafayı yedirtmek üzere bana aşağıdaki buffer temizleme kodlarını kullanmama rağmen temizlenmiyor

       serialPort1.DiscardInBuffer();
         serialPort1.DiscardOutBuffer();

kudretuzuner

Merhaba,
C# bilmiyorum ama VB.Net 2010 ile yazdığım programdaki gibi PIC'ten ne gelirse gelsin programınız geleni ayıklayabiliyorsa sorun olmuyor.Bu çalışmamda PIC'ten yollanan 256 (FF-00) olasılık ardı ardına yolluyor aşağıdaki örnek kod parçacığında görüldüğü gibi yollanan hex değerin DEC değeri kontrol edilip istenen dosya açılıyor.   


Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived


        Dim gelen As String = SerialPort1.ReadByte


        '*****************ANAHTAR TESTİ BAŞLAR
        If gelen = 57 Then '----------'DEC'57'-----hex'31'-----"9"
            PictureBox23.Image = Image.FromFile("c:\resm" + "\SW_1_on.bmp")
        End If
        '-----------------
        If gelen = 74 Then '------------DEC'74'-----HEX'4A'------"J"
            PictureBox24.Image = Image.FromFile("c:\resm" + "\SW_1_on.bmp")
        End If
        '-----------------
Amatör

görkem

#17
ilk okumada  9 byte alıyorum sonraki okumada  9 byte saçma sapan geliyor  verileri alırken delege oluşturup invoke ile almam gerekiyormuş fakat nasıl yapıldığını bilmiyorum örnek de bulamadım

2. okumada saçmalamasa kodları ayıklayabilirim ama saçma sapan değerler geliyor c# daki kodlarda bir sıkıntı olduğu kesin

kudretuzuner

Merhaba,
PIC tarafından yollanacak kodları da ben yazdığım için 8 bit (9 değil) vb.ten tek tek ayıklayıp alabiliyorum.Gelen hex değerleri biliyor musunuz ?
Amatör

görkem

#19
stm32 ile veri gönderiyorum hex değerleri debug yaptığımda görebiliyorum ilk gönderimde sıkıntısız doğru veri geliyor fakat 2. gönderimde alakasız veriler alıyor. stm32 den gönderilirken sıkıntı yok pc de terminalden baktığımda doğru veri geliyor arayüzde sıkıntı var ayıklamayla bile ilgisi olduğunu düşünmüyorum buffer da eski verilerle karışıyor gibi geliyor. Buffer naptıysam sıfırlanmıyor

bu arada 9 byte gönderiyorum, 8bit  gönderim protokolü 

baran123

Sanırım şu şekilde olacak ama emin değilim.
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
 {
 	if (!this.Open) 
 		return;

	if (e.EventType == System.IO.Ports.SerialData.Eof) 
		return;

 	this.Invoke(new EventHandler(delegate { Serial_DataReceived(); }));	
}

private void Serial_DataReceived()
{
    int dataLength = serialPort1.BytesToRead;
    byte[] data = new byte[dataLength];
    serialPort1.Read(data, 0, dataLentgh);

    serialPort1.DiscardInBuffer(); // buffer'ı temizle
}

görkem

yine buffer ı temizlemiyor dediğiniz gibi yaptım dizi taşması hatası veriyor 2 ci okumada çok saçma sapan bir durum var

baran123

Kodların en son halini paylaşman mümkün mü ?
Daha iyi çözümleme yapabiliriz.

görkem

#23
seriport kodlarım aşağıda ilk 9 byte veriyi alıyor sonra 2. 9 byte da dizi taşması hatası veriyor


  

// global tanımlı değişkenler
 byte[] ID = new byte[4];
 byte[] dat = new byte[5];

//---------------------form1_load da tanımlı -------------------------------------------

 serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

 CheckForIllegalCrossThreadCalls = false;

//-----------------------------------------------------------------------
   void seriport_baglan()
            {
                try
                {

                    serialPort1.BaudRate = int.Parse("9600");
                    serialPort1.DataBits = int.Parse("8");

                    serialPort1.StopBits = System.IO.Ports.StopBits.One;

                    serialPort1.Parity = Parity.None;

                    serialPort1.PortName = "COM5";

                    if (serialPort1.IsOpen)
                    {
                        serialPort1.Close();
                    }
                    serialPort1.Open();

                  

                    MessageBox.Show("Bağlandı", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                }
                catch (Exception)
                {
                  

                    MessageBox.Show("Cihazınız Bağlı Değil...", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                }


            }





private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
      

            if (e.EventType == System.IO.Ports.SerialData.Eof)
                  return;
                
            this.Invoke(new EventHandler(delegate { Serial_DataReceived(); }));
        }

        private void Serial_DataReceived()
        {
           
            int dataLength = serialPort1.BytesToRead;
            label27.Text = Convert.ToString(dataLength);
            byte[] buffer = new byte[dataLength];
            serialPort1.Read(buffer, 0, dataLength);
 
       

                ID[0] = buffer[0];
                ID[1] = buffer[1];
                ID[2] = buffer[2];
                ID[3] = buffer[3];
                dat[0] = buffer[4];
                dat[1] = buffer[5];
                dat[2] = buffer[6];
                dat[3] = buffer[7];
                dat[4] = buffer[8];

        serialPort1.DiscardInBuffer(); // buffer'ı temizle

 

         

        }


çıldırmak üzereyim saçma sapan bir durumla karşı karşıyayım

kudretuzuner

Merhaba,
properties bölümünden

ReadBufferSize değerini 4096
WriteBufferSize değerini de 2048 yapınız.
Amatör

görkem

O şekilde ayarlı. bufferı temizleyip sıfırdan veri almıyor bufferı devam ettirmeye çalışıyor temizleyip başa alsa sorun ortadan kalkıcak bir ayrıntı var ama çözemedim gitti

foseydon

Merhaba,

Hocam sen benim söylediğim şekilde yapsan işlerin daha kolay olacak. Event vs. uğraşacağına bir timer kurup içine yukarıda yazdığım kodu eklesen, temiz bir başlangıcın olur ve bunun üstüne inşa etmeye devam ederdin.

Şimdi son gönderdiğin kodda bana göre hatalı olan kısımları söyleyeyim.

1. Her veri aldığından yeni bir buffer[] nesnesi oluşturuyorsun, bu hatalı.
2. Veri geldin buffer[] içerisine aldın diyelim. Daha sonra;
ID[1] = buffer[0];
ID[1] = buffer[1];
ID[2] = buffer[2];
....
deklerasyonları ile buffer içerisindeki veriyi doğru kabul ederek eşitleme yapıyorsun. Oysa önce verinin doğruluğunu kontrol etmen gerekir. Bunun için bir protokolün(basit bile olsa) olması gerekiyor.
3. Sen buffer[] nesnesinin içini temizlediğini düşünüyorsun sanırım. Fakat yanılıyorsun. Verdiğin koda göre buffer[] nesnesini değil, o anda seri portun kendi buffer'ında olan veriyi temizliyorsun. Yani veri geldi, işledin, en son
serialPort1.DiscardInBuffer();
deklerasyonu ile sen bu veriyi toplama ve işleme işlerini yaparken seri portun buffer'ında biriken tüm veriyi silmiş olursun. Akşam eve gidince tam işler kod yazıp koyarım, daha açıklayıcı olur.

foseydon

SerialPortDemo.zip -  16 KB

ufak bir program yazdım, yükledim. seri port özellikleri ayarlayıp bağlantıyı kurduktan sonra verileri 2 ayrı buffer içerisine dolduruyor. Buna bir bak ve dene. Veriyi işlemiyor haliyle. Verileri doğru aldığından emin olunca. işleme işine başlarsın.

görkem

#28
list oluşturarak durumu çözemedim.Verdiğiniz dosyayı indiremedim link kırılmış üzerinden zaman geçtiği için sanırım.
şuanda timer ile veri kaçırdığım için event ile yapmak istedim şuanda  event ile data alabiliyorum datalar doğru geliyor  fakat ara ara  bir önceki alınan data ile yeni gelen data karışıyor. Delegete ve invoke kullanmam durumu çözer mi ?

event oluşturduğum kısım form load da
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);




datanın alındığı kısım
        private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            SerialPort serialPort1 = (SerialPort)sender;
            int len = serialPort1.BytesToRead;
            if (serialPort1.IsOpen)
            {
                serialPort1.Read(buffer, 0, len);

                serialPort1.DiscardInBuffer();

                    ID[0] = buffer[1]; // global tanımlı lar
                    ID[1] = buffer[2];
                    ID[2] = buffer[3];
                    ID[3] = buffer[4];

               

            }
        }

görkem