picle gonderdigim adc sonucunu rs23 ile gondermek$$$

Başlatan gokhangok865, 14 Temmuz 2009, 01:47:37

gokhangok865

arkadaslar picle adc sonucunu rs232 ile bilgisayara gonderiyorum.gonderdigim deger 0 ile 255 arasinda bir deger vitural terminalden baktigim zaman hex olarak dogru degerleri goruyorum.fakat visual basic ile alacam aldigim zaman degerler 0 ile 255 arasinda sayisal bir deger mi olur yoksa FF C3 gibi hex degerleri mi alirim

Lütfi AYYILDIZ

Vitural terminalde gördüğün değerleri aynen görürsün.
VB6.0 kodlar yardımcı olur umarım.
Private Sub MSComm1_OnComm()
   On Error GoTo Comm1Err 
   If MSComm1.CommEvent = comEvReceive Then 
Alınan.text = MSComm1.Input
End If

Exit Sub
Comm1Err:
MsgBox Err.Description, vbOKOnly + vbCritical, "Hata!"
End Sub

gokhangok865

arkadaslar malum uyeligim olmadigi icin 10 kez indirilebiliyormus.ondan dolayi simdi indirilmiyor ama en kisa surede picprojenin paylasimina yukleyemcem

gokhangok865

cobra07 aslinda ben soyle anlatayim durumu sana.bir grafik programi yazdim visual ile.fakat onceden paralel porttan aliyordum. bu grafik cizimi icin gerekli olan bilgiyi.inpout32.dll ile kullaniyordum.inp komutu kullandigim zaman paralel portta bulunan binary deger textte gorunuyordu.yani 1111 1111 icin 255.bu boyle olunca ben grafik cizimi icin bu degerden faydalandim.senin gonderdigin ornekte benim mscomm1 ile alacagim deger hex yani 255 icin ff benim sorum ben bu gelen ff degerini nasil 255 gibi kullanacagim?varsa elinde ornek birsey gonderirsen sevinirim

OG

Alıntı Yap
Öncelikle, ComPort (Interface) haberleşmesinde (Elektronik cihazlar için geçerli) gelebilecek tüm verilerin bilinmesi gerekmektedir. Sen gelebilecek verilerin herpsini bilirsen ona görede bir düzenek oluşturmuş olursun.

Varsayalımki gelmesi olası olan tüm verileri biliyorsun vede hangi formatta olduklarınıda biliyorsun diyelim.

MSComm seri port haberleşmesinde kullanım için iyi bir malzeme değildir.
Bende elektronik cihazları kötü olmasına rağmen MSComm ile kullanıyorum ama fırsat buldukca uğraştığım yeni bir component var bunu bitirirsem sanırım bir çok kişi seri port haberleşmesinde çok büyük bir kolaylık yaşayacak.

MSComm yeterli bir component olmadığından onu basit şekillendirmeler ile kullanmamız gerekmekterir.

Örneğin; Bir hamlede bir paketi almaktansa her veri teker teker alınmalıdır ve paketi tamamlayıcı unsur olan bir karekter yada chr(13) kullanılmalıdır.

Böylelikle gelen veri elimize sağlam gelmiş olacaktır.

Gerçekten sağlammı ?

Evet iyi bir soru :)

Siz doğru yöntemler kullanarak doğru uygulamalar yaparak veriyi seriportdan alsanızda cihaz ile seriport arasındaki kablodan yada cihazın (Neden önemli değil her zaman doğru veri gelmez bozuk gelme olasılığıda düşünülmeli) hatasından dolayı veri bozuk gelmiş olabilir.

Ne yapmalı?

işte burada elektronik cihazı üreten firmalarada iş düşüyor zahmet olmazsa checksum koymaları gerekmektedir.

Aşağıda bunun için basit bir uygulama yapalım.

Verimiz varsayalımki ; 10700*36 olsun

CheckSumHesap isimli Function a ilk 5 bayt gönderelim.

Private Function CheckSumHesap(Veri As String) As Byte
Dim Dongu As Byte

For Dongu = 1 To Len(Veri)

CheckSumHesap = CheckSumHesap Xor Asc(Mid(Veri, Dongu, 1))
Next Dongu

End Function


Görüldüğü gibi gelen veriyi Asc kodlara çevirerek Xor ediyoruz, bu sayede gelen veri için bir checksum hazırlamış olduk.

Sonuç 36 çıkarsa gelen verimiz doğru demektir yok başka bir şey çıkarsa yanlış demektir.

Şimdi verimizi birer birer alalım ve de OnComm kullanmayı öğrenelim.


Private Sub MSComm1_OnComm()

Select Case MSComm1.CommEvent

Case comEvSend:

Case comEvReceive:

End Sub

Oluşturulan bu yapıda Select Case kullanarak Send ve Receive hareketlerini takip edeceğiz.

Bu uygulamanın doğru çalışması için; MSComm1.RThreshold = 1 olması gerekmektedir.

Bu Sayede gelen veri bayt bayt alınacak. Yani gelen verimiz 10700*36 chr(13) ise önce 1 sonra 0 ve diğerlerini takip edecektir.

MSComm1.SThreshold = 1 yaparsanız her bayt da 1 Change olayının gerçekleştiğini burada da görürsünüz.

Bir değişken oluşturalım

Dim GeciciKarakter As String * 1

Bu GeciciKarakter değişkenimizi her baytı almakta kullanacağız.

Private Sub MSComm1_OnComm()
Dim GeciciKarakter As String * 1

Select Case MSComm1.CommEvent

Case comEvSend:

Case comEvReceive:
GeciciKarakter = MSComm1.Input

End Sub

Yukarıda görüldüğü gibi artık her baytı alıyoruz.

Şimdide Dim GelenMesaj As String değişkeni ile gelen her baytı toplayalım.

Private Sub MSComm1_OnComm()
Dim GeciciKarakter As String * 1
Dim GelenMesaj As String

Select Case MSComm1.CommEvent

Case comEvSend:

Case comEvReceive:
GeciciKarakter = MSComm1.Input
GelenMesaj = GelenMesaj & GeciciKarakter

End Sub

Şimdide paketimizi kapatıp uygulama için istediğimiz bir modüle gönderelim. Paketin sonu olduğunu da chr(13) ile anlayalım.


Private Sub MSComm1_OnComm()
Dim GeciciKarakter As String * 1
Dim GelenMesaj As String

Select Case MSComm1.CommEvent

Case comEvSend:

Case comEvReceive:
GeciciKarakter = MSComm1.Input
GelenMesaj = GelenMesaj & GeciciKarakter
If GeciciKarakter = Chr(13) Then
VeriyiKullan (GelenMesaj )
GelenMesaj = ??
End If
End Select
End Sub

Görüldüğü gibi Chr(13) gelene kadar topladık ve sonrada VeriyiKullan isimli Sub a gönderdik.

Şimdi elimizde ?10700*36 Chr(13)? böyle bir verimiz var.

Şimdiki adım VeriyiKullan sub yapmak.

Private Sub VeriyiKullan (Mesaj As String)

End Sub

Gelen verimiz içinde ilk 5 bayt istenilen veri ?*? ayraç 7 ve 8 ise Checksum dır ve Chr(13) ise paketin bitişini gösterir.

Şimdi ilk 5 bayt alalım ve Checksum yapalım.
Ehhh mevcut gelen Checksum da alalım bir kenara atalım.
Sonra kıyaslama yapalım.

Private Sub VeriyiKullan (Mesaj As String)
Dim GelenCheckSum As String

GelenCheckSum = Mid( Mesaj, 7, 2)

If GelenCheckSum = CheckSumHesap(Mid(Mesaj,1,5)) Then
'Doğru ise burada kullanın.
Else
'Yanlış ise burayı kullanın
End If

End Sub


Evet bir şeyler anlatmaya çalıştım umarım ihtiyacı olan arkadaşımın işini ve sonra ihtiyacı olacak arkadaşlarımın işini umarım görür.

Daha uzun ve daha iyi anlatım yapmak isterdim ama şu an içeriden beni çağırıyorlar.

Şimdi gitmeliyim.

Sorunuz olursa yanıtlarım.

Kolay Gelsin

Alıntı YapVisual Basic (VB), diğer dillerden farklı olarak seri port haberleşme için hazır bir
bileşen sunar. Microsoft Comm Control olarak adlandırılan bu bileşen seri portla ilgili bir
çok ayarı beraberinde getirmektedir.
Comm bileşenini form üzerine getirmek için aşağıdaki yol takip edilir.
· Projects menüsünden Components alt başlığı seçilir.
· "Controls" sekmesinden "Microsoft Comm Control 5.0 " yada VB sürümüne
bağlı olarak "Microsoft Comm Control 6.0 " seçilir.
Seçim yapıldıktan sonra alet kutusunun (toolbar) alt tarafında Comm bileşeninin
sembolü görünür. Üzerinde telefon resmi olan bileşen seri portla haberleşmede kullanılacak
Comm bileşenidir.
MsComm bileşeni MSCOMM32.OCX dosyasını kullanılır. Bunun \WINDOWS\
SYSTEM dizininde olması gerekiyor. VB, seri haberleşmesi sürücüsü olarak serialui.dll
dosyasını, MsComm'un arka planında kullanmaktadır.
Kullanılacak her bir seri port için form üzerine bir MsComm bileşeni konur.

Program satırlarında MsComm'un üç özelliği kullanıldı. PortOpen, Output ve Input.
PortOpen: "True" değeri verilerek geçerli port kullanıma açılır.
MsComm1.PortOpen=True
Output: Porta bilgi gönderir. Özellikler penceresinde görünmez.
MsComm1.Output=" MAVİ MENEKŞE"
Output özelliği verilerin hem metin hem de ikilik düzende gönderilmesini sağlar.
"String" tipinde tanımlanan bir değişkeni metin, bayt dizisi olarak tanımlanan bir değişkeni
ikilik düzende gönderir.
‘ İkilik olarak
Dim Talebe() As Byte
.....................................
MsComm1.Output=Talebe
‘Metin olarak
Dim Talebe() As String
MsComm1.Output=Talebe
‘Modeme bir komut göndermek için
MsComm1.Output="ATDT 123-87654"
Input: Belirtilen seri porttan bilgi okur. Okuma işlemi giriş tamponunu da boşaltır.
Text1.Text=MsComm1.Input
Burada iki özellik kullanılmasına rağmen esasında MsComm'un "özellikler"
(properties) kutusunda yazılı olan değerler geçerli kabul edilmişlerdir. İstenirse bu değerler
program satırlarında da değiştirilebilir.
CommPort: Kullanılacak seri port seçilir ve seçilen port numarası okunur.
MsComm1.ComPort=1 ‘Com1 seçilir
Port numaraları 1-99 arasında olabilir.
Settings: Geçerli port ayarları yapılır ve geçerli ayarlar okunur.
MsComm1.Settings="9600,N,8,1" ‘9600 baud hızı, Eşlik biti yok, 8 veri
biti, 1durdurma biti
MsComm'un kabul ettiği baud hızları: 110, 300, 600, 1200, 2400, 9600, 14400,
19200, 38400, 56000, 128000, 256000. Varsayılan değer 9600 dür.
Geçerli eşlik bitleri: E(Even), M(Mark), N(None), O(Odd), S(Space). Varsayılan
olarak None (yok) atanmıştır.
Geçerli bit sayıları: 4, 5, 6, 7, 8. Varsayılan değer 8.
Geçerli durdurma(stop) bitleri: 1, 1.5, 2. Varsayılan değer 1.
InputLen: Seri porta gelen bilgiler tampon belleklerde tutulur. Bu bilgiler okunurken kaç
karakterlik bloklar halinde okunacağını belirtir. 0 değeri atanırsa tek seferde bilgiler okunur.
InBufferCount: Kabul edilen her karakter bir alıcı tamponuna konulur ve InBufferCount
sayısı bir arttırılır. Tamponda bekleyen karakter sayısı, bu değer okunarak öğrenilir. 0 değeri
atanarak tampon boşaltılır.
Örnek kod:
If MSComm1.InBufferCount Then
Varna$ = MSComm1.Input
End If
OutBufferCount: Gönderici tampon alanında sırasını bekleyen karakter sayısını verir. 0
verilerek gönderici alan silinir.
OutBufferSize: Verici için tampon bellek miktarı. Ne kadar büyük bellek ayrılırsa programın
çalışmasına o kadar az yer kalır. Fakat günümüzde bellek kapasitesi yüksek olduğundan
programın ihtiyacına göre belirlenir. Varsayılan değer 512'dir. Bu değer azaltılabilir veya
arttırılabilir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

Alıntı YapSeri Portları Kontrol etmek içIn
Com1 ile com 2 arasına cross kablo yapıyorsunuz.

Com1 Portunu açmak içIn:
Form üzerine bir buton yerlestirin: "Command2"
Bu butonun click olayına aşağıdaki kodu yazın

Private Sub Command2_Click()
On Local Error GoTo PortProblem1
MSComm1.Settings = "9600,E,8,1" '
MSComm1.CommPort = 1
MSComm1.PortOpen = True
'Configure Port As Output
MSComm1.Output = "Port Is opened" + Chr(13)
Exit Sub
PortProblem1:
MsgBox ("Port açık veya kullanımda.")
Exit Sub
End Sub


Girilen Metni Com1 den göndermek içIn
Form üzerine Text kutusu yerleştirin: "Text1"
Form üzerinde bir buton yerleştirin: "Command1",
Bu butonun Click olayına

Private Sub Command1_Click()
On Local Error GoTo PortProblem2
MSComm1.Output = " " + Chr(13)
MSComm1.Output = Text1.Text + Chr(13)
Exit Sub
PortProblem2:
MsgBox ("Veri göndermek içIn önce portu açın.")
Exit Sub
End Sub

kodu yazın.

Uygulamayı çalıştırdığınızda Command2 butonuna basarsanız,
Com1 portu veri göndermek içIn hazır duruma gelir.
Text1'In içine yazdığınız metni göndermek içIn Command1 butonuna basınız.
Göndermiş olduğunuz metin, Com2 ye gelecektir.
Hyperterminali çalıştırın.
Com2 Yi seçIn
Com2 port ayarlarını
Bps=9600,
Data bits=8
Parity=Even
Stop bits=1,
Flow Control=none seçIn

Command1 butonuna bastığınızda Text1. Text değeri Com1 portundan gi cross kablo sayesinde Com2 portuna gelir. HyperTerminalde de bu bilgi görüntülenir.
Cross Kablo Bağlantıları :
1-6-4 kendi aralarında
7-8 kendi aralarında
2-3'e
3-2'ye
5-5'e bağlanır
(Null modem With handshaking)

Alıntı YapSelect Case MSComm1.CommEvent ' Com port olaylalarını kontrolediyor.

Case comEvReceive ' Receive (Alım Gerçekleşitiğinde aşağıdakileri yap
If MSComm1.InBufferCount <> 0 Then ' Seri port içIn ayrılan tampon hafızda bilgi varsa aşağıdakileri yap

GeciciKarakter = MSComm1.Input ' Com port girişindeki bilgiyi geciki karaktere aktar
GelenMesaj = GelenMesaj & GeciciKarakter ' Geçici karakterdeki bilgiyi gelenMesaj değişkenine ekle
text1.tex=GelenMesaj
End If
End Select
End Sub

Not: Tablonuza bir adet mscomm ve textbox nesnesi eklemeyi unutmayın!!!
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

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

Lütfi AYYILDIZ

Gelen veriyi texte aktardığında 0-255 değerlerini görürsün aslında.Yok olmadı dersen linki bir incele.
Hex türündeki bir veriyi 10'lu sisteme çevirmek;
http://www.uslanmam.com/programlama-dilleri/258014-vb-de-taban-aritmetigi.html

gokhangok865

bana da alirim gibi geliyor ama yazdigim programla alamadim.simdi kara kara dusunuyorum acaba donanim kisminda mi bir sorun var diye ben size kodlari gondereyim onu bi inceleyin lutfen #include <16F877.h>

#device ADC=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#byte portb=6
#use delay(clock=4000000)
#use rs232 (baud=9600,  xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
#define use fast_io(a)
unsigned int bilgi;
float gerilim,basinc;
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_TYPE 1
#include <lcd.c>
void main()
{
lcd_init();

set_adc_channel(0);
delay_us(20);
set_tris_a(0xFF);
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports(ALL_ANALOG);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
lcd_init();
while(true)
{

bilgi=read_adc();
gerilim=bilgi*0.018823529411764705882352941176471;
basinc=gerilim*1.4886686048548110266559249010473;
printf(lcd_putc," BASINC=");
lcd_gotoxy(9,1);
printf(lcd_putc,"%fpsi ",basinc);
delay_ms(1000);
printf("%u",bilgi);



}
}[code]

Lütfi AYYILDIZ

Hex değerleri görmekte haklısın. Ben basic´te hserout  [#veri] şeklinde verimi gönderiyorum.Buradaki # karakteri verinin asc olarak gönderilmesini sağlıyor.Aksi halde veriyi hex olarak alırsınız. C de biraz zayıfım printf("%u",bilgi);   "%u " ne ifade ediyor bilmiyorum, basicteki # karakterinin bir karşılığı C de var diye hatırlıyorum,siz daha iyi bilirsiniz.

bigbey

Arkadaşlar şu an yeni bir proje yaptım.
pic ten veri aktarımı. Bilgisayarda Hyper terminalden alıp inceliyorum.
elinizdeki veri sayısal bir değer ise, bu veri'de, decimal olarak 65 sayısı ile eşit bir sayı olsun o zaman terminalde siz o sayıyı ASCII olarak a harfi görürsünüz.
Eğer sayınız decimal 65 ise siz bu sayıyı terminalde 65 olarak görmek isterseniz. 5 sayısına hex30 ilave edeceksiniz göndereceksiniz. 6 sayısına hex30 ilave edip yollayacaksınız o zaman terminal ekranda 65 text yazısını görürsünüz.
TA6R