Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual Basic => Konuyu başlatan: alayli - 06 Mayıs 2009, 12:21:47

Başlık: VB'de single değişkeni 4 bayt hex'e çevirme?..
Gönderen: alayli - 06 Mayıs 2009, 12:21:47
Arkadaşlar merhaba;

Visual Basic'de çok çok yeniyim. Bordun, internetin ve caffeine arkadaşımızın sayesinde ilk RS232-PIC haberleşme programımı başarı ile yapıp çalıştırdım. Şimdi üzerinde çalıştığım ikinci bir proje var. Bu projede single olarak tanımlı 4 baytlık değişkeni RS232 üzerinden IEEE 754 formatında flooting point değişken olarak 4 bayt hex şeklinde göndermem lazım. Virgülden sonra bir hane işimi görüyor. Mesela 34.5 sayısı nette bulduğum hesap makinaları (http://babbage.cs.qc.edu/IEEE-754/Decimal.html) tarafından Hex: 42 0A 00 00 şeklinde hesaplanıyor. Bu hesabı 0 ile 99 arası sayılar için vb'de nasıl yaptırabilirim? Yardımcı olabileceklere şimdiden teşekkür ederim...
Başlık: VB'de single değişkeni 4 bayt hex'e çevirme?..
Gönderen: tnen - 06 Mayıs 2009, 15:33:06
Degeri 10 ile çarp  integer olarak yolla aldığın tarafta 10 a bol
Başlık: VB'de single değişkeni 4 bayt hex'e çevirme?..
Gönderen: alayli - 07 Mayıs 2009, 12:48:35
Alıntı yapılan: "tnen"Degeri 10 ile çarp  integer olarak yolla aldığın tarafta 10 a bol

Sevgili tnen ilgin için teşekkür ederim ama "aldığım tarafa" müdahale imkanım yok. Bu yazılım mikrokontroler içeren bir cihazın simulasyonunu yapacak. Bu sebeple bahsettiğin çözüm aklıma yatsa da kullanmam olası değil. Nette biraz daha araştırınca çözümü buldum. "KERNEL32" üzerinden çalışan bir fonksiyon ile oluyor. Bu fonksiyona ait declarasyonu kodunuzun başlarına değişken tanımlamaları kısmına eklemeniz ve kodda bunu kullanmanız yeterli... Aşağıdaki koda ait basit konvertör programının ekran görüntüsünü ve kaynak kodlarını da ekliyorum. Derleyici olarak vb6.0 kullanılmıştır...



Kaynak kodunu buradan indirebilirsiniz...

'Aşağıdaki declarasyon programınızın başına girilecek. kernel32 üzerinden çalışan bir tür API
'RtlMoveMemory fonksiyonunun kullanımı kod içinden irdelenebilir...
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Dim b(3) As Byte
Dim s    As Single

Private Sub Command1_Click()
If Text1.Text = "" Then
 MsgBox "Single tip değişkeni giriniz!.." & vbCr & vbCr & HataBilgisi, vbExclamation, "Giriş Hatası!"
 Text1.Text = 0: Text1.SetFocus
End If

s = Text1.Text
'RtlMoveMemory s, b(0), 4 'byte arraydan single değişkene değer atar...
RtlMoveMemory b(0), s, 4  'Single değişken içeriğini byte arraya atar...

Text2.Text = b(0)
Text3.Text = b(1)
Text4.Text = b(2)
Text5.Text = b(3)
Text6.Text = Hex(b(0))
Text7.Text = Hex(b(1))
Text8.Text = Hex(b(2))
Text9.Text = Hex(b(3))
End Sub

Private Sub Command2_Click()
If Text2.Text = "" Or Text3.Text = "" Or Text4.Text = "" Or Text5.Text = "" Then
 MsgBox "Byte Array'ları 0 - 255 ARASI giriniz!.." & vbCr & vbCr & HataBilgisi, vbExclamation, "Giriş Hatası!"
 Text2.Text = 0: Text3.Text = 0: Text4.Text = 0: Text5.Text = 0: Text2.SetFocus
ElseIf Text2.Text > 255 Or Text3.Text > 255 Or Text4.Text > 255 Or Text5.Text > 255 Then
 MsgBox "Byte Array'lar 255'den BÜYÜK OLAMAZ!.." & vbCr & vbCr & HataBilgisi, vbExclamation, "Giriş Hatası!"
 Text2.Text = 0: Text3.Text = 0: Text4.Text = 0: Text5.Text = 0: Text2.SetFocus
End If

b(0) = Text2.Text
b(1) = Text3.Text
b(2) = Text4.Text
b(3) = Text5.Text

RtlMoveMemory s, b(0), 4 'byte arraydan single değişkene değer atar...
'RtlMoveMemory b(0), s, 4  'Single değişken içeriğini byte arraya atar...

Text1.Text = s
Text6.Text = Hex(b(0))
Text7.Text = Hex(b(1))
Text8.Text = Hex(b(2))
Text9.Text = Hex(b(3))
End Sub

Private Sub Command3_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Text6.Text = ""
Text7.Text = ""
Text8.Text = ""
Text9.Text = ""
End Sub

Private Sub Form_Load()
Label4.Caption = "Girişler için sadece sayısal değer kullanınız. Single tip değişken girişinde ondalıklı sayıları girerken virgül (,) kullanınız. Nokta (.) ile girilen sayısal değerler hatalı sonuç verecek, alfanümerik girişler <runtime error> almanıza yol açacaktır. Byte Array girişlerinde sadece desimal değer kısmına giriş yapınız ve her bir kutucuğa 0-255 arası değer giriniz. Bu şartları programınızda denetlemek ve kullanıcıyı mesaj ile bilgilendirmek size kalmış..."
End Sub