Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual Basic => Konuyu başlatan: ento - 01 Mart 2013, 00:19:09

Başlık: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 01 Mart 2013, 00:19:09
Seri porttan aldığım NMEA formatında($SMDBT,39.5,f,12.0,M,6.5,F*09) derinlik bilgilerini textbox üzerinde göstermek istiyorum. Gelen tüm veriyi alıyorum onda sıkıntı yok. Yapmak istediğim şey "$" karakteri "*" karakteri arasındaki verileri almak ve "," karakteri arasında kalan bilgileri değişkenlere atayıp textbox'larda göstermek

Bu şekilde nasıl yapbilirim?
text1.box= $SMDBT,39.5,f,12.0,M,6.5,F*09
text2.box= 39.5
text3.box= f
text4.box= 12.0
text5.box= M
text6.box= 6.5
text7.box= F

Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... LÜTFEN YARDIM
Gönderen: mehmet - 01 Mart 2013, 01:03:18
http://www.vb6.us/tutorials/vb6-string-functions (http://www.vb6.us/tutorials/vb6-string-functions)
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... LÜTFEN YARDIM
Gönderen: OG - 01 Mart 2013, 01:16:04
https://hotfile.com/dl/196452334/14c409b/VB6_1.rar.html
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... LÜTFEN YARDIM
Gönderen: rree - 01 Mart 2013, 01:53:15
Strings.mid(....) fonksiyonu ile
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 01 Mart 2013, 21:31:42
Alıntı yapılan: rree - 01 Mart 2013, 01:53:15
Strings.mid(....) fonksiyonu ile

rree hocam mid fonksiyonu ile yaptım. Fakat derinlik bilgisi 1 metre, 10 metre ve 100  metre katlarında basamaklar arttığından mid fonksiyonundan aldığım veriler yanlış oldu.
Aşağıda verdiğim kodlarla çalıştırdım. Split fonksiyonu ile daha kolay oldu. Seri porttan aldığım VERI bilgisinin içinden "," (virgül) karakterini ayırarak bilgileri textboxlara yazdırdım. Üzerinde çalışmaya devam. Yeni fikirlere açığım. Yardımları bekliyorum. Teşekkürler.

[IMG]http://img33.imageshack.us/img33/4021/seriport.jpg[/img] (http://imageshack.us/photo/my-images/33/seriport.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)


Dim VERI, BASLA As String
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputLen = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub

'gelen bilgi
'$SDDBT,182.0,f,55.5,M,30.3,F*08

Private Sub Timer1_Timer()
Do ' Porttan bir haber bekle
  DoEvents
  'Loop Until MSComm1.InBufferCount >= 1
  VERI = MSComm1.Input

BASLA = InStr(1, VERI, "$SDDBT")
Loop Until BASLA <> 0
VERI = Mid$(VERI, BASLA)

Do
    DoEvents
    VERI = VERI & MSComm1.Input
    BASLA = InStr(1, VERI, vbCrLf)
Loop Until BASLA <> 0
VERI = Left$(VERI, BASLA)

info = Split(VERI, ",")
'Now we can display each item of data:
Text1.Text = info(0)
Text2.Text = info(1)
Text3.Text = info(2)
Text4.Text = info(3)
Text5.Text = info(4)
Text6.Text = info(5)
Text7.Text = info(6)
Text8.Text = VERI

End Sub
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: kudretuzuner - 02 Mart 2013, 00:08:32
Merhaba,
VB6 bilmiyorum.VB.Net 2010 express edition kullanmaktayım.Ama mantık değişmez yazılım farkı olur o kadar.
Seriporta gelen datalar bildiğiniz gibi byte şeklinde gelir.Gelen baytlar Hex formundadır.
$SMDBT,39.5,f,12.0,M,6.5,F*09 burada gördüğüm kadarı ile 29 byte gelmektedir.ilk byte $ dır.Hex değeri
H'24' tür(bknz.ASCII).Seri porta gelen bu hex değeri PC'de DEC değeri olan DEC'36' görürsünüz.Şimdi Formun


    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
         Dim gelen As String = SerialPort1.ReadByte               '
        If gelen = 36 Then
            textbox1.text="$"
        End If
        If gelen = 83 Then
            textbox2.text="S"
        End If
    End Sub
Yazarsanız $ geldiğinde textbox1 de "S" gelirse textbox2 de görmeniz gerekir.
Kodlar böyledir.Bir deneyin olmazsa sıkıntı nerede araştırırız.
Aşağıdaki linkte dataların byte durumuna göre picturebox'ların rengini değiştiriyorum.
https://www.dropbox.com/s/0gpkiszyqtlx0is/FEEDBACK_2.rar?m (https://www.dropbox.com/s/0gpkiszyqtlx0is/FEEDBACK_2.rar?m)
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: muhittin_kaplan - 02 Mart 2013, 01:14:56
instr ve instrrev komutları mevcut.

TestPos = InStr(String, Aranan)

Aranan bilgi olarak "T" yaparsak
String olarak "MUHITTIN" Yaparsak
TestPos 5 olur

(instrRev komutu tertsten aramaya başlar. Şunuç 3 olur)

http://msdn.microsoft.com/en-us/library/8460tsh1(v=vs.80).aspx (http://msdn.microsoft.com/en-us/library/8460tsh1(v=vs.80).aspx)

buradan yola çıkarak $ işaretinin yerini bulur. Hatta ilk  ,  karekterininde yerini bulursunuz

size sadece arada kalanları almak kalır.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 02 Mart 2013, 11:08:09
Alıntı yapılan: muhittin_kaplan - 02 Mart 2013, 01:14:56
instr ve instrrev komutları mevcut.

TestPos = InStr(String, Aranan)

Aranan bilgi olarak "T" yaparsak
String olarak "MUHITTIN" Yaparsak
TestPos 5 olur

(instrRev komutu tertsten aramaya başlar. Şunuç 3 olur)

http://msdn.microsoft.com/en-us/library/8460tsh1(v=vs.80).aspx (http://msdn.microsoft.com/en-us/library/8460tsh1(v=vs.80).aspx)

buradan yola çıkarak $ işaretinin yerini bulur. Hatta ilk  ,  karekterininde yerini bulursunuz

size sadece arada kalanları almak kalır.

Muhittin hocam "inStr" komutunu biliyorum. Mesala ilk "," karakterini bulduktan sonra ayırma olayını right yada left komutlarıyla mı yapmam lazım?
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: muhittin_kaplan - 02 Mart 2013, 12:25:39
hocam aynen o şekilde. mid ile de kullanabilirsin

örnek vereyim

dim Mystring as string
mystring="MUHITTIN"

dim Loc as integer

Loc=instr(mystring,"T")

dim TempString as string

TempString=Mid(mystring,Loc,3)   --Bu komut ile Loctan başlayarak 3 karakter alır.


Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 02 Mart 2013, 12:39:10
Öğleden sonra deniyorum.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: omereliusuk - 02 Mart 2013, 15:09:18
char    [] boluculer    = { '$', ',', '*'}; //-Burada bölücüleri diziye attık
string  [] s            =new string[21];
s=deger.Split(boluculer);
//c#.
text2.box= s[1];
text3.box= s[2];
text4.box= s[3];
text5.box=s[4];
text6.box= s[5];
text7.box= s[6];


ama aradığınızın böyle bir şey olması gerekiyor. basic hakkında fazla bir bilgim yok
http://msdn.microsoft.com/en-us/library/6x627e5f(v=vs.80).aspx (http://msdn.microsoft.com/en-us/library/6x627e5f(v=vs.80).aspx)
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 02 Mart 2013, 17:19:22
omereliusuk hocam senin verdiğin kodlar VB'de olmadı. Belki farklı bir kullanımı vardır.

Alıntı yapılan: muhittin_kaplan - 02 Mart 2013, 12:25:39

TempString=Mid(mystring,Loc,3)   --Bu komut ile Loctan başlayarak 3 karakter alır.

inStr ve mid fonksiyonu ile sorun yok. Yapı kafamda oluştu.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: muhittin_kaplan - 02 Mart 2013, 18:35:46
Çalışmaz Çünki C kodu.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: X-Fi - 02 Mart 2013, 19:09:38
Eğer paketdeki bilgilerin yeri değişmiyorsa SubString komutu ile verileri parse edebilirsiniz.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: omereliusuk - 02 Mart 2013, 21:07:42
http://www.seyretogren.com/video/yazilim/visualbasic-net-2010-ders-158-split-metodu.html (http://www.seyretogren.com/video/yazilim/visualbasic-net-2010-ders-158-split-metodu.html)
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: ento - 03 Mart 2013, 00:53:25
omereliusuk hocam video izledim. VB yaptığım metodla aynı. Sonuçta gelen bilgiler aynı formatta olduğu için split fonksiyonu benim için ideal. "," karakteri arasındaki bilgileri alıp istediğini kullan. İlginize teşekkürler.
Başlık: Ynt: SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM
Gönderen: muhittin_kaplan - 04 Mart 2013, 11:02:40
eğer kullandığınız basic
visual basic ise substring çalışmaz. (zaen yoktur)
visual basic.net ise hem mid,left,right gibi komutlar(visual basic import edilerek) hemde substring çalışır.