Yazdığım programda pic'in seriporttan gönderdiği veriyi "Başlat " butonua basınca almak istiyorum ama bunu devamlı olarak alıp ekrana basmam lazım. Bunu yapıyorum Command1 butonuna sonsuz döngü koyunca oluyor fakat bu sefer program kilitleniyor.
Benim yapmak istediğim command1'e basınca seriporttaki değeri alıp yazdırsın , command2'ye basınca dursun. veya command1'e ikinci defa basınca dursun.
Bunu nasıl yapabilirim.
Kod aşağıdaki gibidir.
Private Sub Command1_Click()
MSComm1.InputLen = 0
If MSComm1.InBufferCount > 0 Then
a = Val(MSComm1.Input)
Text1.Text = a
End If
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "115200,n,8,1"
MSComm1.PortOpen = True
End Sub
merhaba SüleymanKara,
bir zamanlar VB ile bir Eprom programmer yapmistim
"Private Sub cmdRead_Click()" buttona basinca program bir döngü icerisinde epromu okumaya basliyor ve döngü bitinceye kadar istesemde Cancel yapilmiyordu.. sonra döngü icerisine bir "DoEvents" koymak gerektigini ögrenmistim.. belki seninde böyle bir seye ihtiyacin var ?
DoEvents koyunca VB döngü icerisinde baska islemleride kontrol ediyor (mesela bir buttona basilip basilmadigini)
Dim i As Long
For i = 1 To 1000000
DoEvents
...
Next i
kolay gelsin
Bir değişken yap,
Eğer değişken "1" ise bilgiyi okumaya başlasın "0" ise okuma yapmasın.
Butona basılınca da değişkeni "0" ise "1" , "1" ise "0" yapsın.
Programın çalıştığı ama işlem yapmadığı "0" durumunda 0.1 saniyelik bir bekletme koyarsın. Bu da tıkanmayı önleyebilir.
Dim i As Long
For i = 1 To 1000000
DoEvents
...
Next i
yerine sadece döngü içerindeki herhangibir yere DoEvents yazman yeterli
Ben normalde Delphi kullanıyorum ama bu MsComm component inin data gelince oluşturduğu bir event i olması lazım. Bu durumda kodunu o event in içine yazacaksın hiç sorun kalmayacak. Eğer böyle bir şansın yoksa timer da kullanabilirsin. Normalde timerlar en az 18 ms de bir çalışırlar bu nedenle buffer ı biraz büyük tutarak timer kullanıp kaçırmadan data alabilirsin...
Visual Basic kod çalıştırırken form üzerindeki hareketleride takip edebilir ve kullanıcı arayüzü olarak çalışmaya devam eder. Formda bir talep oluştuğunda bu talebe ait koduda çalıştırabilir. doevent genelde bunun için kullanılır.
Birde 115200 baudrate yi hangi pic ile kullanmayı düşünüyorsun ?
Önce bir booelan değişken tanımla.
command1 e basınca ;
dur = false 'kontrol değişkeni başlangıç değeri
do 'sonsuz döngü girişi
if dur = true then exit do ' kullanıcı talebi ile döngüden çıkma
Burada seri portu oku
doevent
loop
.
.
.
command2 ye basınca ;
dur = true ' döngüden çıkma isteği
Bence de timer çözüm gibi duruyor.
Alıntı yapılan: NecroCapoBence de timer çözüm gibi duruyor.
bencede timer nesnesi tek çözüm...
sonsuz döngü işlemciyi yorar ve ram i şişirir ve dolayısıyla makinanız kilitlenir.
ayrıca vb de döngüden çıkma komutları
for döngüsü için:
Exit ForWhile-DO ve Do-Loop için:
Exit Dokomutlarıdır...
mscomm ocx in on_comm eventını kullanırsan daha profesyonel bir yaklaşım olacaktır
Event kullanmayacaksan doevents fonksiyonunu kullan
Private Sub MSComm1_OnComm()
Dim sData As String
If MSComm1.CommEvent = comEvReceive Then
sData = 0
sData = MSComm1.Input
Text1.Text = Asc(sData)
End If
Burda herhangi bir veri alındığında,MSComm1_OnComm() fonksiyonu devreye girer ve alınan veri sData değişkenine aktarılır.