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.
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.
Jos numerosarja on aina saman mittainen, voit vastaanottaa noita merkkejä esim. taulukkoon.
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.
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.
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
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
En ole mikään mestari VB:n kanssa ja en oikeen ymmärrä mitä tuossa koodissa tapahtuu ja en saanut sitä toimimaankaan millää lailla.
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.
Heippa taas Dukex!
Sorry...
Data() = StrConv(Chr(Format(CInt(MSComm1.Input), "000")), vbUnicode)
Aihe on jo aika vanha, joten et voi enää vastata siihen.