Helppiä..
VB:lle
Miten pitäis toteuttaa com portin luku, kun lukiessa nopeudella 9600 ,N,8,1
mutta Puskurimuisti täyttyy liian nopeasti.
Laite lähettää tietoa.
Numero1, numero2, kytkintila1, kytkintila2
numero1 on maxsimissaan 65536 ja minimissään 1
numero2 on maxsimissaan 4096 ja minimissään 0
kytkintilat ovat joko 1 tai 0
Luvun yksi ja kaksi eteen olen laittanut pituus merkin montako merkkiä numero1 sisältää.
Pituus1, numero1, pituus2, numero2, kytkin1, kytkin2, 13, 10
Laitoin jonon perään merkin 13,10 (Vbcrlf) ja luin tietoa.
Timer1.Enabled = False MSComm1.InputLen = 1 Do datain = datain & MSComm1.Input Loop Until InStr(datain, vbCrLf) Timer1.Enabled = True
Luku hommeliin hyppään timer1 avulla Interval=1
Ainoastaa lukemalla kokopuskurin tyhjäks kerralla
MSComm1.InputLen = 0 datain = MSComm1.Input
Silloin puskuri ei täyty, mutta miten erottelen tiedot sieltä?
Laitteen lähettämää nopeutta kun ei kai voi suurentaa max. 9600
Moro!
Itse lukisin puskurin tyhjäksi juuri noin ja lisäisin puskurin sisällön aina merkkijonon perään.
Dim DataIn as String Dim Paikka as integer Dim YksiTieto as string MSComm1.InputLen = 0 datain = datain & MSComm1.Input 'Testataan onko kokonainen tieto tullut (Monesko merkki on Vbcrlf) paikka=instr(datain,Vbcrlf) if Paikka>0 then 'Jos on, luetaan erotinmerkkiin saakka muuttujaan 'yksitieto yksitieto=left(datain,paikka) 'Jätetään seuraavan tiedon rippeet muuttujaan datain datain=right(datain,len(datain)-paikka) 'TÄSSÄ SITTEN TEHTÄIS JOTAIN TUOLLE YKSITIETO MUUTTUJASSA OLEVALLE TIEDOLLE end if
Ja koko tuo hässäkkä Timerin sisällä, lukutiheys saa olla suhteellisen harvakin. Toivottavasti käsitin ongelman oikein.
Juu kiitti.
Vähän samanllailla toteutin itsekkin, ei nyt ihan noin lyhyellä rivimäärällä, mutta ajatus sama.
Täytyy vielä muutaa noilla left ja right käskyillä se.
Onko tuohon vielä muuta mahdollisuuta kun ne numero1 ja numero2 ovat joskus eripituisia kuin merkitä ne jotenkin.
laitoin siihen nyt A,B ja C merkit, että tiedän mistä seuraava alkaa ja loppuu
esim. tietoa tulisi
A,65536,B,4096,C,1,0
tai
A,1000,B,0,C,1,0
Sitten mid:llä silmukassa lukee A ja B välistä tiedon, B ja C välistä,
C jälkeen kaksi seuraavaa olisivat jo sitten kytkintietoa.
Nuo kaikki tiedot täytyy saada talteen, mutta jos puskuriin on tullut enemmän ajattelin dim:llä tallentaa ne taulukkon talteen ja vain viimeksi tulleilla päivitän näyttöön lukemat.
Tuo numero1 on pulssin pituutta 2us resoluutiolla ja numero2 on jännitetietoa millivoltteina.
Niitä tietoja tulisi alustavalla systeemillä maksimissaan 100 kertaa sekunnissa ja pitäis ehtiä piirtämään näyttöönkin asiat.
>A,65536,B,4096,C,1,0
Hmm, eikö yksinkertaisempaa olisi lukea tieto aina seuraavaan pilkkuun asti.. Turha vaihe toi ABC liennee.
Esim Tieto olisi "65536,4096,1,0"
Dim i as integer dim mJono as string Dim Paikka as integer mjono="65536,4096,1,0" For i=0 to 3 Paikka=instr(mJono,",") select case i: case 0: numero1=val(left(mjono,paikka)) case 1: numero2=val(left(mjono,paikka)) case 2: kytkintila1=val(left(mjono,paikka)) case 3: kytkintila2=val(left(mjono,paikka)) end select 'Karsitaan mjonosta luettu tieto pois mjono=right(mjono,len(mjono)-paikka) next i
Pientä säätöä voipi olla, mutta ajatus toi. Tämä juttu toimii vaikka tiedon pituus vaihtelisi kuin..
Siellä lähtöpäässä pilkulla erotetaan muuttujat, lukiessa sitä pilkkua ei näy.
sillon kun lähettää esim. 65536,4096,1,0
lukiessa se näkyy 65536409610 ne tulee yhdessä pötkössä,pystyykö noita muuten erottellee?
vai pitääkö se sitten lähettää.
65536,","4096,","1,","0
ajateli vaan noiden pilkkujen tilalle laittaa kirjaimet, että
tiedä A-B välissä olevan numero1 , jos jostain syystä kaikki merkit eivät tulisikaan perille tai muuten tilttaisi välillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.