SERİ PORTTAN ALINAN VERİYİ BÖLMEK... YARDIM

Başlatan ento, 01 Mart 2013, 00:19:09

ento

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


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

rree


ento

#4
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]

Uploaded with 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

kudretuzuner

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
Amatör

muhittin_kaplan

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

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

size sadece arada kalanları almak kalır.

ento

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

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?

muhittin_kaplan

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.



ento


omereliusuk

#10
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

ento

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.

muhittin_kaplan


X-Fi

Eğer paketdeki bilgilerin yeri değişmiyorsa SubString komutu ile verileri parse edebilirsiniz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)