Seri porta veri gönderme

Başlatan electricker, 01 Temmuz 2013, 02:17:23

electricker

Seri Porta bir uygulama üzerinden modüle TX ine" FF 00 81 82 23 "gibi bir veri göndermek istiyorum. Veriyi
string veri = textBox1.Text;
 textBox1.Text = veri; serialPort1.WriteLine(veri);
   komutuyla yazdığımda donuyor , bu veriyi donmadan nasıl gönderebilirm ? Ve de aynı şekilde modülden aldığım response uda ekrana yazdırmam gerek , yardımlarınız için teşekkürler..

MrDarK

Hocam seri port açıkken gönderiyorsun değil mi ?

Seri port uygulamaları biraz kasıntı oluyor gerçekten sana tavsiyem hazır basit bir seri port gönder al programını editleyerek kendi projeni oluşturman , en azından write receive fonksiyonları hazır olur onunla uğraşmazsın.

Şahsen ben öyle yaptım :)
Picproje Eğitim Gönüllüleri ~ MrDarK

Tagli

C# ile en son 2008'de uğraşmıştım ama hatırladığım kadarıyla seri porttan veriyi byte dizisi olarak çıkarmıştım. Belki string'i byte dizisine çevirerek o şekilde dışarı yollayabilirsin.
Gökçe Tağlıoğlu

Kabil ATICI

http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp.htm
"Example 5" başlığı altındaki uygulamayı bir incele işini görebilir...
ambar7

Gökhan BEKEN

#4
Aşağıdaki fonkson seri porttan bir veri geldiğinde kendi kendine devreye girer ve istediğiniz yere sonuçları yazdırabilirsiniz. Burda sadece messagebox ile gösteriliyor. Bu işlemleri yapabilmeniz için formunuza serialport1 adlı nesnenin bulunması gerekir. Sol taraftaki tools tan ekleyiniz.

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
 
byte[] buffer;
 
buffer = new byte[1];
 
serialPort1.Read(buffer, 0, 0);
 
MessageBox.Show("Gelen veri:" serialPort1.ReadExisting()); // her gelen veriyi otomatik görmenize gerek yoksa bu satırın başına // koyunuz
 
}


formun load kısmına
CheckForIllegalCrossThreadCalls = false;
kodunu eklemeniz gerekiyor.



Eğer bağlantıyı nasıl yaptığımızı bilmiyorsanız buyrun:

void seri_port_baglan()
 
{
 
if (serialPort1.IsOpen) // Bağlantıyı açıyoruz.eğer önceden bağlan butonuna basmış isek yani bağlantıyı açmışsak aşağıdaki hata mesajını verecektir.
 
{
 
MessageBox.Show("Port Açık Bulunmaktadır..", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
 
return;
 
}
 
else
 
{
 
try
 
{
 
serialPort1.BaudRate = int.Parse("9600"); // Hız olarak 9600 verdik.
 
serialPort1.DataBits = int.Parse("8"); // Veri bit ini de 8 bit olarak verdik
 
serialPort1.StopBits = System.IO.Ports.StopBits.One; // Durma bitini tek sefer olarak verdik.
 
serialPort1.Parity = Parity.None; // eşlik bit ini vermedik.
 
serialPort1.PortName = comboBox1.Text; // Port adlarını comboboxtan alıyoruz.
 
serialPort1.Open(); // Bağlantıyı açıyoruz
 
MessageBox.Show("Bağlantı Başarılı");
 
}
 
catch (Exception) // Herhangi bir hata anında alttaki hata mesajını alacağız..
 
{
 
MessageBox.Show("cihazınız bağlı değil...", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
 
}
 
}


Veri gönderme fonksiyonu:

private void seri_port_data_gonder(string gonderilecek_veri)
 
{
 
try
 
{
 
if (serialPort1.IsOpen)
 
{
 
serialPort1.Write(gonderilecek_veri);
 
System.Threading.Thread.Sleep(150);
 
//alıcı cihaza okuması için biraz süre tanımak gerek, kul yapısı sonuçta 
 
}
 
}
 
catch (Exception)
 
{
 
MessageBox.Show("Sonuç: Başarısız !", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button3);
 
}
 
}
 
}


Özel mesaj okumuyorum, lütfen göndermeyin.

micelow

#5
Programda donma yaşıyorsan doğru portu açtığından emin ol eğer abuk sabuk karakterler görürsen baud rate ayarlarının eşit olmasını sağla. İyi çalışmalar.
"Bir tek şeye ihtiyacımız var çalışkan olmak."

electricker

Com ayarları ve baundrate ayarları doğru . Modül 19200 de çalışıyor ve com 6 da takılı . Seri portu kısa devre yaptığımda gönderdiğim değeri aynen geri alıyorum. Fakat modüle ulaştırdığımda modülden gelen response' u okuyamıyor program , yazmıyor .. Gönderilen veri FF XX XX XX XX gibi geri gönderilen
FF XX XX XX XX AA BB CC DD gibi bir bilgi. Harfli kısım ID kısmını oluşturuyor. Modülün kendi programı var düzgün çalışıyor fakat ben gönderdiğim komuta gelen response u okuyamıyorum sıkıntı bence burada..

Gökhan BEKEN

Cevap verebilmesi için, modüle zaman tanıdınız mı?
Mesela ben her komut gönderme işleminden sonra,
System.Threading.Thread.Sleep(150);
Yazıp gelen cevabı öyle okuyorum. Bunu yapmayınca, daha veriyi göndermeden cevap okumaya kalkmış oluyoruz.
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

Anladım hocam , bunu ilk yazdığınız zaman yapmıştım fakat işe yaramadı. Kendi programıyla modül okuyor , sadece gönderilen veriye gelen response u görmem gerek. Okuyup text boxa yazdırmadan dışarda text dosyasına yazdırsam farkeder mi ?

camby

CheckForIllegalCrossThreadCalls = false;

ile ve

System.Threading.Thread.Sleep(150);

yapılan işlem nedir ?

Gökhan BEKEN

Alıntı yapılan: camby - 03 Temmuz 2013, 14:44:38
CheckForIllegalCrossThreadCalls = false;

ile ve

System.Threading.Thread.Sleep(150);

yapılan işlem nedir ?

Textboxlar main thread'a bağlıdır, burada oluşan bir nesnedir.

Seriportun datareceived eventi kendine başka bir thread açar ve sürekli dinleme yapar ki böylece yeni data geldiğinde bunu alabilelim. Bu satırı yazmazsak: Event içinde datayı alıp, başka thread'a ait textboxa yazdırmaya çalıştığımız için derleyici "Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on." yani "Çapraz-iş parçacığı işlemi geçersiz ; hatası verir.

textbox1 bu thread üzerinde oluşturulmamış ki" mealinde birşeyler söylüyor, ee o zaman nasıl mümkün? Tabiki, bu denetimi aşağıdaki kodu form_load eventine veya form constructor'ının içine yazarak devre dışı bırakırsan.

CheckForIllegalCrossThreadCalls = false;

Daha önce burda anlatılmıştı bende ordan öğrenmiştim: https://www.picproje.org/index.php?topic=36159.15



System.Threading.Thread.Sleep(150); komutu ise 150 mili saniye bekleme yapıyor. Amacı bir cihaza veri gönderdiğimizde, okuma yapma veya yeni veri göndermesi yapacaksak, gönderdiğimiz verileri işlemesi veya kaydetmesi için ona bir süre tanıyoruz, yeni komutlarımızı sonra gönderiyoruz. Bunu yapmazsak ilk gönderdiklerimizi işlemeden yeni veriler gönderiyoruz ve cihaz bunları hazmedemiyor. Bu istemeyen bir durumdur. 150ms yerine başka bir değer yazmanız gerekebilir bu süreyi cihaza göre ayarlamak gerek. Deneyerek bulunabilir.
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;

            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] bytesToSend = new byte[5] { 0xFF, 0x00, 0x01, 0x82, 0x83 };

            System.Threading.Thread.Sleep(150);
            

            serialPort1.Write(bytesToSend, 0, 5);

            System.Threading.Thread.Sleep(150);


       }
        
        private void button2_Click(object sender, EventArgs e)
        {
            byte[] buffer;

            buffer = new byte[64];
            System.Threading.Thread.Sleep(1500);
            serialPort1.Read(buffer, 0,10 );
            string hex = BitConverter.ToString(buffer);

            
            //serialPort1.ReadExisting()
            
                

                MessageBox.Show("Gelen veri:" + hex); 
            
            
            
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] bytesToSend = new byte[5] { 0xFF, 0x00, 0x01, 0x80, 0x81 };

            System.Threading.Thread.Sleep(150);

           

            serialPort1.Write(bytesToSend, 0, 5);

            System.Threading.Thread.Sleep(150);

        }

        private void button4_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
        }
    }
}


Hocam sıkıntı gelen veriyi byte türünden hex e aktarmaktaymış . "" string hex = BitConverter.ToString(buffer); "" komutu ile gelen veriyi HEX olarak görüyorum. Problem giderildi . Teşekküler..