Elikkäs minulla on seuraavanlainen ongelma:
eli olen määrittänyt muutajan Resp = string , elikkä se on merkkijono. (tai
käytännössä esimerkkikoodissa tuo on määritetty stringiksi, enkä uskalla
sorkkia sitä)
mitentuosta muuttujasta saa purettua esimerkiksi 10 viimeisintä bittiä ja
käännettyä ne vielä desimaaliarvoksi? (Vb6:ssa)
Esimerkki:
Resp = (hex arvo)e0 80 97 ff , tulostuu näin : à?-ÿ , binääriarvo tuolle acsii sotkulle: 11100000100000001001011111111111, eli tästä binääristä pitäisi saada käyttöön vain nuo 10 viimeistä bittiä : eli 1111111111 ja ulos pitäisi saada desimaali arvo : 1023
Ja mitäkö tällä tehdään, olen hommannut USB purkin joka loggaa jännitteitä,
mutta antaa ulos tuollaista sekasotkua eli mukana on oikeita ascii merkkejä
ja loppu data on sitten bittejä, jotka kertovat jännite arvon tyyliin
4,096/1023 * x = anturin jännite.
mukaan esimerkki koodinpätkä, joka tulostaa arvoksi tuon ascii sotkun:
Private Sub TickTimer_Timer(ByVal Milliseconds As Long) Dim k1 As Integer, k2 As Integer Dim RxBytes As Long, BytesRead As Long, TxBytes As Long, Events As Long Dim ModemStatus As Long, Resp As String Dim intFileHandle As Integer Dim strRETP As String 'This event reads the FT USB port periodically to see if there is any data pending ' and if there is, it decodes it. It thus handles both Ox and Smart Patch data. ' Ox data is output under a different regime (via the EventTimer event), but Smart ' Patch data is re-formatted and output directly herewith. 'returns ModemStatus in which bit4=CTS, bit5=DSR, bit6=RI, bit7=DCD ' and reported value is '0' if FT232BM pin is +5V, and '1' if pin is 0V ftStatus FT_GetModemStatus(ftHandle, ModemStatus) 'returns number of bytes waiting to be read ftStatus FT_GetQueueStatus(ftHandle, RxBytes) Text1.Text = toBinary(ModemStatus, 12) If RxBytes > 255 Then RxBytes = 255 If RxBytes Then ' Text2.Text = RxBytes ftStatus FT_Read(ftHandle, ReadBuffer, RxBytes, BytesRead) RxBuffer = RxBuffer + Left(ReadBuffer, BytesRead) 'all incoming packets end with <CR> k1 = InStr(RxBuffer, vbCr) Do While k1 RxResponse = Left(RxBuffer, k1 - 1) If Len(RxResponse) > 2 Then Resp = Mid(RxResponse, 2, Len(RxResponse) - 2) RxBuffer = Mid(RxBuffer, k1 + 1) k2 = Len(RxResponse) Select Case Left(RxResponse, 1) Case DC1: Text2.Text = Resp Case ACK: Text3.Text = Resp Case Else: List1.AddItem Resp: List1.ListIndex = List1.ListCount - 1 End Select k1 = InStr(RxBuffer, vbCr) Loop End If End Sub
Mod. edit: kooditagit
Kun tieto on merkkijonona, ensimmäinen vaihe on muuttaa se luvuksi. Merkkijono on tavallaan luvun esitys 256-järjestelmässä, joten ensin täytyy valikoida oikeat merkit Mid-funktiolla ja selvittää merkkien numeroarvot Asc-funktiolla. Tämän jälkeen luku saadaan laskemalla yhteen viimeisen merkin arvo kerrottuna 2560:lla (eli yhdellä), toiseksi viimeisen merkin arvo kerrottuna 2561:llä, kolmanneksi viimeisen merkin arvo kerrottuna 2562:lla jne. Nyt luvusta voidaan erottaa halutut bitit käyttämällä And-operaatiota. Jos luvusta a halutaan b viimeistä bittiä, merkintä on a And 2 ^ b - 1.
Tässä on esimerkki, joka pystyy selvittämään suoraan luvun 1 - 16 viimeistä bittiä.
Dim teksti As String Dim loppu As Long, vikat As Long teksti = Chr(&HE0) + Chr(&H80) + Chr(&H97) + Chr(&HFF) ' muodostetaan luku kahdesta viimeisestä merkistä loppu = Asc(Mid(teksti, Len(teksti) - 1, 1)) * 256& + _ Asc(Mid(teksti, Len(teksti), 1)) ' erotetaan luvusta kymmenen viimeistä bittiä vikat = loppu And 2 ^ 10 - 1 MsgBox vikat ' 1023
Käyttämissäsi funktioissa saattaa hyvinkin olla jokin näppärämpi tapa tätä asiaa varten, mutta en tunne niitä tarkemmin.
Jeps hyvin pelittää, kiitän!
Aihe on jo aika vanha, joten et voi enää vastata siihen.