Gönderen Konu: seriport hakkında  (Okunma sayısı 1461 defa)

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #15 : 09 Ekim 2017, 08:28:00 »
ş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();
« Son Düzenleme: 09 Ekim 2017, 09:28:18 Gönderen: görkem »

Çevrimdışı kudretuzuner

  • Emektar
  • *****
  • İleti: 995
  • Amatör
Ynt: seriport hakkında
« Yanıtla #16 : 09 Ekim 2017, 09:37:36 »
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
        '-----------------
Cem Caniklioğlu - Lingual Ortodonti Kliniği

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #17 : 09 Ekim 2017, 09:43:09 »
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
« Son Düzenleme: 09 Ekim 2017, 09:44:43 Gönderen: görkem »

Çevrimdışı kudretuzuner

  • Emektar
  • *****
  • İleti: 995
  • Amatör
Ynt: seriport hakkında
« Yanıtla #18 : 09 Ekim 2017, 10:02:07 »
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 ?
Cem Caniklioğlu - Lingual Ortodonti Kliniği

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #19 : 09 Ekim 2017, 10:17:07 »
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ü 
« Son Düzenleme: 09 Ekim 2017, 10:18:35 Gönderen: görkem »

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1925
Ynt: seriport hakkında
« Yanıtla #20 : 09 Ekim 2017, 10:34:47 »
Sanırım şu şekilde olacak ama emin değilim.
Kod: [Seç]
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
}

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #21 : 09 Ekim 2017, 11:28:31 »
yine buffer ı temizlemiyor dediğiniz gibi yaptım dizi taşması hatası veriyor 2 ci okumada çok saçma sapan bir durum var

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1925
Ynt: seriport hakkında
« Yanıtla #22 : 09 Ekim 2017, 12:25:11 »
Kodların en son halini paylaşman mümkün mü ?
Daha iyi çözümleme yapabiliriz.

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #23 : 09 Ekim 2017, 12:35:29 »
seriport kodlarım aşağıda ilk 9 byte veriyi alıyor sonra 2. 9 byte da dizi taşması hatası veriyor


Kod: [Seç]
 

// 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
« Son Düzenleme: 09 Ekim 2017, 12:42:28 Gönderen: görkem »

Çevrimdışı kudretuzuner

  • Emektar
  • *****
  • İleti: 995
  • Amatör
Ynt: seriport hakkında
« Yanıtla #24 : 09 Ekim 2017, 13:19:28 »
Merhaba,
properties bölümünden

ReadBufferSize değerini 4096
WriteBufferSize değerini de 2048 yapınız.
Cem Caniklioğlu - Lingual Ortodonti Kliniği

Çevrimdışı görkem

  • Kıdemli
  • ****
  • İleti: 219
Ynt: seriport hakkında
« Yanıtla #25 : 09 Ekim 2017, 13:44:33 »
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