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];
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 (http://www.codeproject.com/KB/cs/serialcommunication.aspx) incelerseniz iyi olur.
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.
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
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.
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.
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.
SerialPort s = new SerialPort();
s.PortName = "COM1";
byte[] data = new byte[]
{ 0xFF, 0xCC, 0xAA };
s.Open();
s.Write(data, 0, data.Length);
s.Close();
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)
{
}
}
}
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)
.
.
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.
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/)
http://imageshack.us/photo/my-images/155/unledbqh.jpg/
yukarida verdidigim resimde checkbox nasil global yapilir gosteriliyor diger toolboxlarinda global yapilmasi aynidir...
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
&& logical, & bitwise
tek & ile maskeleme yapip >> ile de kaydirmalisin.
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.
Alıntı yapılan: cicjoe - 27 Ekim 2011, 06:48:29
&& logical, & bitwise
&& Logıcal operandını kullanabilmem için if yapısını kullanmak gerekli gibi gözüküyor. Nedenini anlayamadım.
mir_82, dediklerinizi tam olarak harfiy'yen anladım. Zaten PIC, kendisine gelen veriler için neredeyse apaçi dansı yapacak kadar rahat bir durumda. Ancak o şekilde yapmak için, yine de veriyi bölmek gerekecek. Öyle ki, iki byte'lık bir veri gidecek sonuçta. Ancak kesinlikle 3 byte olmayacak(zaten olamaz). Onun için veri aralığı 00 00---FF FF arasında kalacak.
Daha açık ifade edeyim, en fazla dec.65535 olan textBox1.TextLength'nin iki byte'lık değerini, DT_Send adlı dizinin 0 ve 1 nolu index'sine yüklemek istiyorum.
Abi o zaman şunu uygulayabilirsin.
sayımız 65535 olsun bunu ilk önce hexadesimal e çevir. 0 x FFFF oldu mu. Sonra bunun alt byte ını maskele
yani 0 x FFFF i 0 X FF00 ile mantıksal and yap. Şimdi elinde sadece 0 X FF00 kaldı. Sonra bunu iki defa sağa kaydır. Elinde 0 x 00FF kaldı. Sonra bu veriyi pic e gönderebilirsin. Üst byte ı elde ettin. İstersen bu şekilde gönder istersen decimal e çevir gönder. Ama bence int8 e çevir. Bundan sonra bu veriyi PIC e gönderebilirsin.
İkinci alt byte daha kolay: 0 XFFFF i 0x00FF ile mantıksal and yap. elinde alt byte kalacak: yani 0 x 00FF. Bunu ister decimale çevir ister int8.
Hocam yapmak istediğim tam olarak belirttiğiniz şey. Ancak bir türlü texBox1.textlength'deki veriyi Hex'e çevirip içeriğini diziye atabileceğim kodu yazamadım. Hazır bir kod istemiyorum, sadece örnek bir kod olması yeterli.
Örneğin aşağıdaki kod.
DS1 = Convert.ToInt16(textBox1.TextLength);
PCDataW[0] = DS1 & 0x00FF;
Ne yaptıysam derleyici hata verdi. Ayrıca ilgine teşekkür ederim.
hocam Convert.ToInt16(textBox1.Text);
Kullanır mısın. Şu anda firmadayım ama sen kodu yanlış yazmışsın. Textbox un içindeki veriyi almak için Convert.ToInt16(textBox1.Text); yazman gerek.
bunu bir denesene
&& mantiksal oldugu icin true veya false dondurur, & bit tabanli oldugu icin bit kumesi dondurur operandlarin tipine gore. en guzel aciklama dedigin gibi kod ile olacak sanirim.
static void Main(string[] args)
{
uint dataX = 0xAAAABBBB;
ushort dataL = (ushort)(dataX & 0xFFFF);
ushort dataH = (ushort)((dataX & 0xFFFF0000) >> 16);
Console.WriteLine("X = {0:X}\nH = {1:X}\tL= {2:X}",
dataX, dataH, dataL);
Console.ReadKey();
}
Cicjoe hocam, verdiğiniz örnek alt parçayı komple koda yapıştırdım, ama çalışmadı. Ben de değişkenleri global bölgede tanımladım. dataX'teki veriyi ayrıştırarak dataL'ye ve dataH'ye sorunsuzca (hex format'ta) yükledim. Ama hex veri dizi[0]'a yüklenmedi. Kod'umun tamamı aşağıda, //Slash işaretleri arasında belirttim
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();
}
short dataX ; //= 0x0FFFBBBB;
ushort dataL;
ushort dataH ;
int DS1 = 12;
int DS2 = 14;
byte[] W1 = new byte[] { 0x00 };
byte[] W2 = new byte[] { 0x00 };
byte[] PCDataW = new byte[] { 0x00 };
byte[] Read_24C1_AA = new byte[] { 0xAA }; //Default
byte[] Read_24C2_AA = new byte[] { 0x00 }; //Default
byte[] Read_DS1307_AA = new byte[] { 0x00 }; //Default
byte[] Read_DS1621_AA = new byte[] { 0x00 }; //Default
byte[] Read_DS1307_STL = new byte[] { 0x00 }; //Default
byte[] AnmX_24C2 = new byte[] { 0x00 }; //Default
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.Items.Add("Stil0");
comboBox1.Items.Add("Stil1");
comboBox1.Items.Add("Stil2");
comboBox1.Items.Add("Stil3");
comboBox1.Items.Add("Stil4");
comboBox2.Items.Add("Animasyon Yok");
comboBox2.Items.Add("Animasyon1");
}
private void button1_Click(object sender, EventArgs e)
{
int EEPROM1x = 0;
int EEPROM2x = 0;
serialPort1.Open();
MessageBox.Show("Port açıldı");
////-----------------------------------
PCDataW[0] = 0xA1;
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ı");
////-----------------------------------
PCDataW[0] = 0xA2; //EEPROM2 yazılacak
serialPort1.Write(PCDataW, 0, 1);
MessageBox.Show("EEPROM2 yazılacak");
while (EEPROM2x < textBox2.TextLength)
{
textBox2.Select(EEPROM2x, 1);
serialPort1.WriteLine((textBox2.SelectedText));
EEPROM2x = EEPROM2x + 1;
}
MessageBox.Show("EEPROM2 yazıldı");
////----------------------------------
//---------------Konfigürasyon ve Animasyon Bilgileri-------//
PCDataW[0] = 0xA3; //24C1 Okunup okunmayacağı bilgisi
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(Read_24C1_AA, 0, 1);
PCDataW[0] = 0xA4; //24C2 Okunup okunmayacağı bilgisi
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(Read_24C2_AA, 0, 1);
PCDataW[0] = 0xA5; //DS1621 Okunup okunmayacağı bilgisi
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(Read_DS1621_AA, 0, 1);
PCDataW[0] = 0xA6; //DS1307 Okunup okunmayacağı bilgisi
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(Read_DS1307_AA, 0, 1);
MessageBox.Show("Konfigürasyon Bilgileri Yazıldı");
//-----------------
PCDataW[0] = 0xA7; //DS1307 Okuma Stili
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(Read_DS1307_STL, 0, 1);
MessageBox.Show("Tarih ve Zaman Stili Seçildi");
//-----------------
PCDataW[0] = 0xA8; //24C2 Okuma Stili (Animasyon türü)
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Write(AnmX_24C2, 0, 1);
MessageBox.Show("Animasyon Türü Seçildi");
//-----------------
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
dataX = Convert.ToInt16(textBox1.TextLength);
dataL = (ushort)(dataX & 0x0000FF);
dataH = (ushort)((dataX & 0x00FF00) >> 16);
//DataL'yi PCDataW[0]'a Atılmıyor?<<<<<<<<<<<<<<<<<<<<<<<<<<
serialPort1.Write(PCDataW, 0, 1);
serialPort1.Close();
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if
(checkBox1.Checked)
{
Read_24C1_AA[0] = 0xAA;
}
else
Read_24C1_AA[0] = 0x00;
}
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
if
(checkBox1.Checked)
{
Read_DS1307_AA[0] = 0xAA;
}
else
Read_DS1307_AA[0] = 0x00;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (comboBox1.SelectedIndex)
{
case (0):
Read_DS1307_STL[0] = 0x00;
break;
case 1 :
Read_DS1621_AA[0] = 0x01;
break;
case 2 :
Read_DS1307_AA[0] = 0x02;
break;
case 3 :
Read_DS1307_AA[0] = 0x03;
break;
case 4 :
Read_DS1307_AA[0] = 0x04;
break;
default :
Read_DS1307_AA[0] = 0x00;
break;
}
}
}
}
senin byte ise veri tipin, soyle dener misin
ushort dataX = 0xAABB;
byte dataL = (byte)(dataX & 0xFF);
byte dataH = (byte)((dataX & 0xFF00) >> 8 );
Evet, dataL ve dataH değişkenlerini byte türünde tanımlayınca diziye direkt atabildim. Cicjeo ve mir_as82 hocam ilgilendiğiniz için sağolun.
Bu arada tüm arkadaşların Kurban bayramı mübarek olsun.
Yukarıdaki kod, teorikte çalışan bir algoritma içeriyor. Arabirimde birkaç texbox, buton, listbox ve bir de Com nesnesi mevcut. Belirtildiği üzere, texbox ve listbox verilerini - Com'a iletiyor. Sorum şu;
32 Bit xp/sp3'te oluşturduğum bu (Visual C#) exe dosyasını, farklı bir işletim sisteminde (xp-64bit, win7, pardus gibi) direkt çalıştırabilir miyim? Bu farklı ortamlarda - özellikle Com'a erişimde C# kodları için bir uyumsuzluk olabilir mi?