Visual C# Text'ten RS232'ye veri gönderme

Başlatan FEHMİ_ASM, 19 Ekim 2011, 18:32:45

FEHMİ_ASM

    Arkadaşlar bilgisayarım laptop olduğundan seri port yok. Eltima ila sanal bir seri port oluşturdum. Ve verileri bu sanal porta yollayacağım. Verileri tek tek gönderdim ama bunları textBox'tan alıp göndermeliyim.
   Sorum şu : textBox1'in x'inci indexsinde bulunan değeri DT_Send adlı değişkene nasıl gönderirim (yani atayabilirim)?

NOT : textBox'ın içerisine yazılan verilerin uzunluğu değişebilir, 5 de olabilir 1500 de (en fazla 4000 civarı.)
         Veri alımı en baştan başlayıp, textBox'un son elemanına kadar sürecek ve orada bitecektir. Yani veri alımı
         texBox'taki toplam eleman sayısına endexlidir.
_________________________________

PIC'te yapılabilecek benzer bir kod dizilimi;
x = 6;
DT_Send = Text [x];


Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

mozkan87

Bunun için dinamik dizi oluşturup textbox'tan verileri bu diziye atarak yapabilirsiniz. Ancak c# için böyle bir şeye gerek olacağını düşünmüyorum. Doğrudan string'de gönderebilirsiniz. Linki incelerseniz iyi olur.

MILKBOY

            int a;
            textBox1.Select(5, 1);
            a = Convert.ToInt16(textBox1.SelectedText);

bu komutlar textbox' a yazılan verinin 5. karakterinden itibaren 1 karakter seçerek a değişkenine aktarır.

FEHMİ_ASM

#3
Alıntı yapılan: MILKBOY - 19 Ekim 2011, 21:44:40
            int a;
            textBox1.Select(5, 1);
            a = Convert.ToInt16(textBox1.SelectedText);

            Evet, yukarıdakine göre textBox'ın belirlenen indexsini okuyabiliyorum. Ancak değişken tipinden dolayı mı bilmiyorum, bu seferde sıradaki değer com'a gitmiyor (gidiyor ama eskisi gidiyor).  Örnek olarak aşağıdaki kodu veriyorum.

Alıntı Yap
            int x = 0;
         
            textBox1.Select(x, 1);
            serialPort1.WriteLine((textBox1.SelectedText));
            MessageBox.Show(textBox1.SelectedText);

            x = x++;                            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            serialPort1.WriteLine((textBox1.SelectedText));
            MessageBox.Show(textBox1.SelectedText);

            x = x++;
            serialPort1.WriteLine((textBox1.SelectedText));
            MessageBox.Show(textBox1.SelectedText);

İşaretli satırda sanki x'in değeri değişmiyor da, MessageBox'ta bile önceki değer gösteriliyor. Oysa textBox'ın bir sonraki index'sinde farklı bir karakter var.


EDİT : TextBox'tan veri alma sorunu sanırım çözüldü. Yoruldum ve sabah devam edeceğim. Test edince bilgilendireceğim
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

MILKBOY

x değişkenini arttırdıktan sonra "textBox1.Select(x, 1);" komutu ile tekrar seçmen lazım. senin yazdığın kodda x seçilecek karakterin sıra numarası. seçilen karakter değil.


FEHMİ_ASM

#5
Sorun meğer gözümün önünde imiş.

İşte tam ilk satırın altında --- textBox1.Select(x,1); --- tanımı her döngüde yapılması gerekiyormuş. Yani doğrusu;
            x = x++; 
                textBox1.Select(x, 1);    //<<<<<<<<<<<<<<<<Bu tanımı her döngüde yazmam lazımmış
            serialPort1.WriteLine((textBox1.SelectedText));
            MessageBox.Show(textBox1.SelectedText);

  Şimdi textBox'ın içindeki karakter sayısını bulmam gerekiyor. Bunun için textBox'ın hangi özelliğini kullanmam gerekiyor? Ama bu özellikte aşağıdaki kural yer almalı:
  -- Diyelim ki TextBox'a 14 adet karakterden oluşan bir cümle yazdık. Bunun uzunluğunu ölçtük ve 14 çıktı,
-- Şimdi de BackSpace (veya mause) ile sondaki iki karakteri sildik, ölçüm sonucu artık 12 olmalı.
-- Yani, textBox'ta gözle görülen son karakterden sonraki boşluk verme dahil, hiçbir şey dikkate alınmamalı.

   Yok önereceğiniz özellik'de yukarıdaki kural geçerli değil ise, textBox'ın sonundan başlayarak en başa kadar karakter nerede var diye test edeceğim.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

FEHMİ_ASM

#6
   TextBox'a yazılan veri uzunluğu, "textBox.Length" parametresi ile belirleniyor(muş). Ancak, yukarıda olmasını istediğim özellikleri barındırmıyor. Örneğin textBox'ta yan yana değil de alt alta karakter yazarsanız, daha üç karakter yazmışken, 7 karakter yazmışsınız gibi gözüküyor. Yani korktuğum başıma geldi, ama çok önemi yok. İlgisiz karakterleri boşluk olarak değerlendireceğim  :)

  Şimdi herhangi bir değişkene bir byte'lık hex değer verebilirsem visual kısmı da hemen hemen tamamlamış olacağım. Aşağıda verdiğim örneği Visual C# ile nasıl tanımlayabilirim?
Data = 0xFF;   //Hex veri, en fazla 255 olacağında decimal da olabilir
serialPort1.WriteLine((0xFF veya Data))


Data değişkeni içeriğini tırnak içine aldığımda karaktermiş gibi görülüyor portta.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

cicjoe

SerialPort s = new SerialPort();
s.PortName = "COM1";
byte[] data = new byte[]
{ 0xFF, 0xCC, 0xAA };
s.Open();
s.Write(data, 0, data.Length);
s.Close();

FEHMİ_ASM

#8
   Evet, yukadaki örnek kodu uyarlayarak hex olarak bir değer oluşturdum. Ama buna diğer bazı ekipmanlardan (örn. checkBox) da erişebilmek için Global hale getirmem gerekli. Nasıl yapabilirim? Ve tanımı (doğru olması gerekirse) tam olarak nerede yapmam lazım?

  Aşağıda yazılımın bir parçasını veriyorum.
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            string Test;
            comboBox1.Items.Add("A1");
            comboBox1.Items.Add("A2");
            comboBox1.Items.Add("A3");
        }

 //////////////////////////////////////////////////////////////////////////////

        private void button1_Click(object sender, EventArgs e)
        {
            int EEPROM1x = 0;
            int EEPROM2x = 0;
            serialPort1.Open();
            MessageBox.Show("Port açıldı");

////---------------------------------------------------------------------------

            byte[] PCDataW = new byte[] { 0xA0 };  //EEPROM1 yazılacak
            serialPort1.Write(PCDataW, 0, 1);  //PIC Bu veriyi alınca EEPROM1'i silmeli
            MessageBox.Show("EEPROM1 yazılacak");

            while (EEPROM1x < textBox1.TextLength)
            {
             textBox1.Select(EEPROM1x, 1);
             serialPort1.WriteLine((textBox1.SelectedText));
             EEPROM1x = EEPROM1x + 1;
            }
            MessageBox.Show("EEPROM1 yazıldı");

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
          {

          }
    }
}
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

fatihinanc

Merhaba,

Değişkenlerinizi aşağıdaki alan içerisinde tanımlarsanız global olacaktır.
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
         
        int degisken;
        private void Form1_Load(object sender, EventArgs e)
        .
        .
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

FEHMİ_ASM

  fatihinanç hocam size de merhaba.

  PIC'de neredeyse tüm yazılımını bitirdiğim bir projenin Visual kısmındayım. Benim için bu konuda temel sorunları çözmek, projeyi tamamlamanın son adımı. Öyle ki, bu konuda sorduğum yaklaşık dört soru, bana birçok şeyi öğretti. Yukarıda benim sorunlarımla ilgilenen tüm arkadaşlarıma içtenliğimle teşekkür ediyorum. Allah hepinizden razı olur inşallah.
 
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

justice_for_all

Alıntı yapılan: FEHMİ_ASM - 24 Ekim 2011, 17:43:08
Ama buna diğer bazı ekipmanlardan (örn. checkBox) da erişebilmek için Global hale getirmem gerekli.



http://imageshack.us/photo/my-images/155/unledbqh.jpg/

yukarida verdidigim resimde checkbox nasil global yapilir gosteriliyor diger toolboxlarinda global yapilmasi aynidir...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

FEHMİ_ASM

#12
  Hocam sabahtır uğraşmaktayım son noktada takıldım kaldım.

  Int türünde bir değişken tanımlıyorum. İki byte'tan oluşan bu değer, texbox'tan alınıyor ve Port' a gidecek. Ama önce hex'e çevirmem lazım. Onun için de diziye atıyorum. Fakat diziye yükleyeceğim değeri ikiye bölemedim gitti.

Net bir şekilde - yapmak istediğim; (int ya da byte) değişkenin hex karşılığının önce üst byte'nı sonra alt byte'nı (veya önce alt sonra üst byte'nı) W1 dizisinin (0.) index'ine almak. Aşağıdaki gibi yaptım ancak olmadı. Nerede hata yapıyorum?

            DS = Convert.ToInt16(textBox1.TextLength); // Uzunluk Hex formata çevriliyor
            W1[0] = (DS && 0x00FF);  // DS'de oluşan 2 Byte lık  hex, Low Byte elde etmek için maskeleniyor
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

cicjoe

&& logical, & bitwise
tek & ile maskeleme yapip >> ile de kaydirmalisin.

mir_as82

Arkadaşım şu anda işteyim çalışıyorum. Onun için koldarı yazabilecek fırsatım yok. Ama sana şu şekilde bir yolda gösterebilirim.

örneğin 3456 sayısını göndereceğini farzedelim.

Önce bu verinin başlayacağını bildiren bir işaret gönder. (Onluk sistemde 11 hiç bir zaman olmayacağı için 11 de gönderebilirsin 255 sayısınıda)
. Bu sayıyı pic te okuduntaktan sonta sıralı bir şekilde 3 , 4 , 5 , 6 yı gönder. if gelen veri işaret sayısı== senin seçtiğin sayı ise sıralı olarak verileri almaya başla.

sayıyı aldın diyelim

3
4
5
6

Bunlar sayının rakam değerleridir. Bunu gönderdiğin sayıya çevirmek için: 3 x 1000 + 4 x 100 + 5 x 10 + 6x1 yap. Bu kesin olarak işini çözecektir.