Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Infrapunavastaanotin

Sivun loppuun

Dukex [02.02.2007 10:48:40]

#

Olen rakentanut IR vastaanottimen MBnetin ohjeiden mukaisesti ja saanutkin tämän toimimaan MBIRVAST ohjelmalla jolla siis tallennetaan kaukosäätimen antama pulssisarja muistiin. Mutta ongelmana nyt on se että haluaisin tietää millä saan tämän koodin muistiin käyttäen visual basic 6:sta. Olen tehnyt ohjelman joka kirjoittaa tämän numerosarjan text kenttään ja kaukosäätimen nappia pohjassa pitämällä koodirivi jatkuu niin kauan kun nappia painetaan. Siis millä voisin saada taltioitua jonkun pätkän kaukosäätimen lähettämästä koodista vb:n muistiin ja hyödyntää tätä esim. uusien ohjelmien avaamiseen tai vaikka LPT portin ohjaamiseen? Jouduin kirjoittamaan tämän koulun välitunnilla ja epäselvyyksiä voi olla. Yritän kuitenkin selvittää jos jotain tarvitsee.

Dukex [04.02.2007 16:26:27]

#

Okei, eli selvennän vähän.

Olen siis tehnyt pienimuotoisen ohjelman jossa on text -kenttä.

Dim data() As Byte

Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Settings = "1200, n, 8, 1"
MSComm1.InputLen = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub

Private Sub Timer1_Timer()

If MSComm1.InBufferCount Then
    data() = MSComm1.Input
    Text1.SelText = data(0) & vbCrLf
End If

End Sub

Kun painan kaukosäätimestä jotain nappia niin tekstikenttään tulee "normaalisti"
7 kappaletta desimaaliarvoja allekkain esim.

144
87
44
24
67
120
99

Ja tämä lista jatkuu samanlaisella sarjalla kun painan kaukosäätimen nappia toisen kerran. Nyt siis ongelmana on se että millä voisin saada tuon numerosarjan "talteen" niin että voisin kaukosäätimestä tallennella ohjelmaan erilaisia nappeja muistiin ja ohjelma osaisi tunnistaa niitä? Ongelman voisi ratkaista sillä että rakentaisi oman kaukosäätimen jonne voisi itse syöttää arvoja mitä se lähettää mutta sitä en jaksa/osaa tehdä. Toivottavasti tämä selvennys auttoi edes jotain ymmärtämään.

sqwiik [04.02.2007 18:56:35]

#

Jos numerosarja on aina saman mittainen, voit vastaanottaa noita merkkejä esim. taulukkoon.

Antti Laaksonen [04.02.2007 19:13:13]

#

Voit kerätä numerosarjan myös merkkijonoon:

' koodin alussa
Dim komento As String

' tämä vastaa tekstikenttään kirjoitusta
komento = komento & Chr(data(0))

(Funktio Chr muuttaa tavun kokoisen kokonaisluvun merkiksi.)

Ennen komennon alkua muuttuja täytyy tyhjentää:

komento = ""

Nyt komentoa voi tutkia vaikka näin:

If komento = Chr(144) & Chr(87) & Chr(44) & Chr(24) _
             & Chr(67) & Chr(120) & Chr(99) Then
    MsgBox "Annettiin komento X"
End If

Eri komentoja voi kerätä taulukkoon:

' koodin alussa
Dim komennot(20) As String
Dim kmaara As Integer

' komennon lisäys
kmaara = kmaara + 1
komennot(kmaara) = komento

' komennon etsiminen
For i = 1 to kmaara
    If komennot(i) = komento Then
        MsgBox "Annettiin komento " & i
    End If
Next

Nämä koodit eivät ole täydellisiä, koska en pääse kokeilemaan asioita käytännössä, mutta ideoiden pitäisi olla kelvollisia. Esim. komennon luvun voisi luultavasti toteuttaa yksinkertaisemmin.

Dukex [04.02.2007 21:37:06]

#

Noniin. Tällä sain toimimaan osittain. Kiitoksia Antille. Mutta uutena ongelmana on se että kaukosäädin ei välttämättä aina lähetä juuri tiettyä lukusarjaa, vaan monesti sen edellä on vielä yksi luku joka vaihtelee satunnaisesti. Ja jos tälläinen luku tuli eteen niin se sekoitti koko pakan ja ohjelma piti suorittaa uudelleen ennenkuin tärppäsi uudelleen. No tämän periaattees voi korjata etsimällä hyvän kaukosäätimen.

Kuitenkin jos esim. komennot osuu yhteen ja tuo if lause toteutuu niin jos se ei heti perään toteudu toista kertaa niin seki saa pakan sekaisin ja ei meinaa tunnistaa enää ollenkaa vaikka oikeanlainen käsky osuisikin kohdalle.

neau33 [05.02.2007 03:47:00]

#

Heippa Dukex!

Viimeksi maitsemasi ongelman syy voi olla:
Error Correction lisää 2-bittiä tavun bittisarjaan. Jos näin on asian laita niin tällöin pitäsi 'corrected' data hakea portista ja jättää edellinen data joko tallentamatta tai tallentaa se johonkin virhetaulukkoon, jonka tietoja voisi sitten käyttää vertailuun mahdollisessa virheenkäsittelyrutiininssa.

'Esim:
Sub Tarkistus()
 For i = LBound(virhetaulu()) To UBound(virhetaulu())
  If virhetaulu(i) =  komento Then Goto HelpInErrorCase
 Next i
 Exit Sub
jatkotoimet:
 'plaa plaa plaa
 Exit Sub
HelpInErrorCase:
 Err.Clear: DoEvents
 Shell "C:\Program files\Internet Explorer\iexplore.exe https://www.ohjelmointiputka.net/", vbMaximizedFocus
 Return jatkotoimet
End Sub

neau33 [05.02.2007 13:10:26]

#

Heippa taas Dukex!

Kokeile vielä napata data jotenkin tähän tyyliin...

If MSComm1.CommEvent = 2 And MSComm1.InBufferCount > 0 Then
 Dim IsTrue As Boolean
  Data() = Format(CInt(MSComm1.Input), "000")
 For i = LBound(Data()) To UBound(Data())
   IsTrue = InStr(Hex(Data(i)), "F")
  If IsTrue Then
   MsgBox "Shit!", VbExclamation, Me.Caption
   'plaa
  End If
 Next i
 'plaa
 MSComm1.Output = Chr$(26)
End If

Dukex [05.02.2007 14:01:19]

#

En ole mikään mestari VB:n kanssa ja en oikeen ymmärrä mitä tuossa koodissa tapahtuu ja en saanut sitä toimimaankaan millää lailla.

peran [05.02.2007 19:26:25]

#

En valitettavasti osaa riittävän hyvin VB:n syntaksia, joten kuvailen mahdollista ratkaisua, jossa voit käyttää Antin esimerkkiä apuna.

Havaintoja:
1. Saat 7 merkkiä kaukosäätimestä.
2. 6 merkkiä niistä ei muutu.

1. Luo ehdokas-string muuttuja, jonka pidät aina 6:n merkin mittaisena. (Alustukseksi voit tehdä vaikka välilyönneillä).
2. kun luet yhden merkin kaukosäätimestä. Lisäät merkin ehdokas-stringmuuttujaan ja poistat ehdokas-muuttujan ensimmäisen merkin. Sen jälkeen vertaat ehdokas-merkkijonoa mahdollisiin käskyihin (, kun komennot on kerätty taulukkoon).
Huom. Komentojenkin tulee olla 6:n merkin mittaisia.

neau33 [05.02.2007 22:05:31]

#

Heippa taas Dukex!

Sorry...

Data() = StrConv(Chr(Format(CInt(MSComm1.Input), "000")), vbUnicode)

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta