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
http://www.vb6.us/tutorials/vb6-string-functions (http://www.vb6.us/tutorials/vb6-string-functions)
https://hotfile.com/dl/196452334/14c409b/VB6_1.rar.html
Strings.mid(....) fonksiyonu ile
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
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)
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.
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?
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.
Öğleden sonra deniyorum.
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)
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.
Çalışmaz Çünki C kodu.
Eğer paketdeki bilgilerin yeri değişmiyorsa SubString komutu ile verileri parse edebilirsiniz.
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)
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.
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.