Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6 (Excel) ja COM-portti (VBA)

Sivun loppuun

Arto [27.05.2011 07:18:07]

#

huomenta vaan taasen kaikille.
olen tekemässä ohjelmaa joka kerää tietoa missä paikoissa olen käynyt(paikat ennalta määrättyjä, joiden koordinaatit tunnetaan). sain gps laitteen lähettämään tietoa comm porttiin, tai ainakin hyper terminaali niin näyttää. kuinka saan vb:n lukemaan comporttia??

gps lähettää nmea koodia 6 riviä kerrallaan, noin sekunnin välein. tässä esimerkki datasta:

$GPGGA,041130.620,6250.4130,N,02738.0913,E,1,05,3.1,56.7,M,19.0,M,,0000*66
$GPGSA,A,3,20,11,32,31,24,,,,,,,,4.3,3.1,3.0*33
$GPGSV,3,1,10,32,72,225,34,24,66,200,32,11,45,189,36,20,45,254,43*7A
$GPGSV,3,2,10,14,37,059,,17,31,305,,31,23,118,33,12,10,026,*7B
$GPGSV,3,3,10,23,09,208,,22,03,088,*79
$GPRMC,041130.620,A,6250.4130,N,02738.0913,E,0.00,0.00,270511,,,A*6F
$GPGGA,041131.199,6250.4142,N,02738.1127,E,1,05,3.1,84.6,M,19.0,M,,0000*67
$GPGSA,A,3,20,11,32,31,24,,,,,,,,4.3,3.1,3.0*33
$GPGSV,3,1,10,32,72,225,34,24,66,200,33,11,45,189,38,20,45,254,43*75
$GPGSV,3,2,10,14,37,059,,17,31,305,,31,23,118,34,12,10,026,*7C
$GPGSV,3,3,10,23,09,208,,22,03,088,*79
$GPRMC,041131.199,A,6250.4142,N,02738.1127,E,1.86,307.11,270511,,,A*6B
$GPGGA,041132.000,6250.4116,N,02738.1214,E,1,05,3.1,86.5,M,19.0,M,,0000*66
$GPGSA,A,3,20,11,32,31,24,,,,,,,,4.3,3.1,3.0*33
$GPGSV,3,1,10,32,72,225,34,24,66,200,34,11,45,189,38,20,45,254,44*75
$GPGSV,3,2,10,14,37,059,,17,31,305,,31,23,118,34,12,10,026,27*79
$GPGSV,3,3,10,23,09,208,,22,03,088,28*73
$GPRMC,041132.000,A,6250.4116,N,02738.1214,E,0.07,260.34,270511,,,A*64

tässä on 3 "pakettia" tietoo
tuon koodinhan varmaan sitten saa johonki strigiin ja siitä alkaa laskemaan paikkaa.

neau33 [27.05.2011 09:01:54]

#

Moi Arto!

tsekkaa tämä

Arto [30.05.2011 18:16:54]

#

Toimii!! =)

ErroR++ [31.05.2011 17:38:25]

#

Öö laita vaikka tieto se sen stringin sijasta mieluummin objectiin.

Arto [31.05.2011 18:40:09]

#

Ööö tarkoitat tällä mitä?? eli jotenkinhan se paikka, pituus ja leveys asteet täytyy tuolta onkia esille että pääsee laskemaan. paikka tieto löytyy riviltä

$GPGGA,XXXXXX.XXX,XXXX.XXXX,X,XXXXX.XXXX,X,X,XX,X.X,XXX.X,X,XX.X,X,,XXXX*X
toinen numero löytyy 2. ja 3. pilkun välistä ja toinen 4. ja 5. pilkun välistä.

mut eikös tää tästä lähre instr komennolla aukeemaan, eli etsin tuon $GPGGA:n ja saan tiedon missä kohtaa se on siihen lisään ~10 ja lähen siirtämään tästä merkki kerrallaan toiseen stringgiin ja sitten stringi long muotoon ja laskemaan.

noin periaatteessa....

Metabolix [31.05.2011 18:45:06]

#

Ehkä oli tarkoitus huomauttaa siitä päivänselvästä asiasta, että pidemmän päälle se data kannattaa tietenkin muuntaa tekstistä luvuiksi ja tallentaa asianmukaisiin muuttujiin.

Säännölliset lausekkeet olisivat tuollaisen datan erotteluun erinomaisia, mutta VB6 ei taida luonnostaan tuntea sellaisia...

Grez [31.05.2011 20:32:10]

#

Onko tuo muuten nyt sitten VB6 vai VBA (Excel)? Anyways, kummassakin voi käyttää scripting hostin regexpejä jos siltä tuntuu, mutta minusta tuossa on melkeinpä helpompaa vaan splitata kiinnostavat sanomat pilkulla ja poimia tiedot siitä kuin säätää regexpiä käyttöön.

Itse huomauttaisin sen verran että pelkän kerran sekunnissa tulevan $GPRMC -sanoman lukeminen riittää koordinaattitiedon saamiseen.

Arto [31.05.2011 21:02:08]

#

nii no sekai nyt on ihan yks ja sama kummastako lauseesta sen koordinaatin lukee. molemmat tulee kerran sekunnissa, muistaakseni vaan tuossa $GPGGA lausessa on sateliittien määräkin mukana

Grez [31.05.2011 21:34:11]

#

No oikeastaan olennainen pointti ei ollut, että kummasta lukee ne koordinaatit, vaan sen, että ne muut 5 riviä voi jättää huomiotta. En oikeastaan kiinnittänyt huomiota tuohon viestiisi, jossa kerroit jo lukevasi ne pelkästä GPGGA:sta. Eli en tarkoittanut esimerkiksi sanoa, että se olisi väärä valinta.

GPRMC (Recommended minimum specific GPS/Transit data) on sellainen sanoma jonka käytännössä kaikki GPS-vastaanottimet lähettää ja siksi yleensä käytän sitä, ellen erityisesti tarvitse muita tietoja.

Arto kirjoitti:

mut eikös tää tästä lähre instr komennolla aukeemaan

Itse käyttäisin tylysti Split -funktiota.

Arto [31.05.2011 22:21:38]

#

split??

jaaps toihan vois olla paljon helpompi tyyli... kaikkee oppii kun vanhaks elää. =)

Arto [06.06.2011 19:14:16]

#

no niii. taasen täälä itkemässä..
toi Nean linkittämä koodi tuosta commin lukemisesta toimii XP:llä loistavasti. win 7 toimii muuten mutta ei jostain syystä osaa "sammuttaa" porttia. alustaa portin ja lukeekin ihan oikein mutta sammuttaessa menee ihan jukkeliin ja antaa jonkun numerosarja herjan. osaiskohan joku auttaa??


joo mittää en muuttanu mutta nyt se toimii....?!?

Arto [08.06.2011 21:01:09]

#

hmm... saakohan tuota com portin lukemista millään muulla tyylin toteutettua?? ei ole mikään vakaa WIN 7:ssä toimimaan. saako tuon mscomm jutun vba:han??

Metabolix [08.06.2011 23:01:18]

#

Oma ratkaisuni olisi tehdä pääohjelmasta TCP-pohjainen ja laittaa erillinen ohjelma siirtämään dataa sarjaportista TCP:hen. Haittana marginaalisesti raskaampi ratkaisu, etuna siistimpi rakenne ja tarvittaessa tuki näiden kahden palikan pyörittämisestä eri koneilla. Sarjaporttihommiin pitäisi löytyä valmiitakin ohjelmia, itse olen käyttänyt socat-nimistä ohjelmaa, mutta en tiedä, miten hyvin sen Windows- tai siis Cygwin-versio hallitsee sarjaportteja.

neau33 [09.06.2011 03:04:00]

#

Moi Arto!

Microsoft Comm Control (mscomm32.ocx) saa heittämällä VBA:han mikäli VB6 Pro tai Enterprise on asennettuna. Jutska toimii ilman VB6 asennustakin, mutta edellyttää pientä rekisterin käpistelyä (omalla vastuulla of course). Latauslinkki ja ohjeita löytyy esim. täältä.

Jos järjestelmäsi on 32-bittinen ja olet asentanut .NET Framework 4.0 + SDK-paketin niin täältä löytyy .zip paketti joka sisältää .NET kirjaston ja ohjeet com- tyyppikirjaston luomiseen ja rekisteröintiin sekä Excel 2003 versiolla väännetyn VBA-esimerkkiprojektin.

Arto [09.06.2011 08:21:12]

#

hmm... mää vähä arvelen että tuossa apilla tehyssä jutussa käy niin että yritän lukea tietoo just sillä hetkellä kun sinne tallennetaa uutta gps:n toimesta. ja sillon tilttas. näkyy olevan ihan sama mitä nappia painaa kun jää jumiin, joskus taas toimii kauan ihan hyvin. nii en saanu tuota rekisteri hommelia toimimaan.

neau33 [09.06.2011 09:46:17]

#

Moi taas Arto!

kerro nyt ihmeessä, että mitä apilla tehtyä juttua nyt tarkoitat ja minkä rekisteröintiä et saa toimimaan ja samalla myös, että sattuuko Windows 7:si olemaan 32 vaiko 64-bittinen ja jos 64-bittinen niin onko mahdollisesti muuta julkaisua, kuin Home Premium..?

groovyb [09.06.2011 11:36:29]

#

Arto, sarjaportista ei voi lukea samalla kun kirjoittaa, ja toisinpäin. Toimii yksisuuntaisesti. .NET:in Serialport controllissa on bool IsOpen() metodi jolla voi tarkastaa onko yhteys jo auki, käyttämistäsi apeista en tiedä.

Muista myös määrittää sarjaportin timeoutit avaamiselle, kirjoittamiselle ja lukemiselle, jotta softasi ei tilttaa kun yhteyttä sarjaporttiin ei saada

Metabolix [09.06.2011 12:04:09]

#

groovyb kirjoitti:

Arto, sarjaportista ei voi lukea samalla kun kirjoittaa, ja toisinpäin. Toimii yksisuuntaisesti.

Mikähän satu se tällainen on? Ja oli totta tai ei, tässä ei nyt käsitellä mitään sarjaportin yksittäisiä pinnejä mikrokontrollerilla. Kyllä käyttöjärjestelmän pitäisi oletusarvoisesti hoitaa tekniset kysymykset kirjoituksen ajoituksesta. Jos ei hoida, on huono käyttis.

Sitä paitsi eihän kysyjä edes ollut kirjoittamassa sarjaporttiin mitään.

Grez [09.06.2011 12:11:07]

#

groovyb kirjoitti:

Arto, sarjaportista ei voi lukea samalla kun kirjoittaa, ja toisinpäin. Toimii yksisuuntaisesti.

Sarjaportti on kylläkin täysin "full duplex" eli kaksisuuntainen. Jos nopeus on esimerkiksi 115200bps, niin siitä voi vaikka jatkuvasti tunkea 115200 bittiä sekunnissa ulos ja samaan aikaa ottaa 115200 bittiä sekunnissa sisään.

groovyb [09.06.2011 12:15:35]

#

lainaus:

yritän lukea tietoo just sillä hetkellä kun sinne tallennetaa uutta gps:n toimesta

Oletin että lukee GPS:stä suoraan, jonkun komennon kautta jolla määritetään mitä luetaan, jolloin ensin kirjoitetaan ja sitten luetaan.

Ja tässä tapauksessa, ei käyttis tee mitään (jos gps kirjoittaa samaan aikaan). Koska sarjaportti on yhdensuuntainen (niinkuin kaikki sarjaväylällä olevat tekniikat, modbus etc), ei voi kaksi laitetta kirjoittaa samaan aikaan.Se kumpi ensin saa avattua yhteyden, pitää sitä auki.

Edit, Grez,kokeileppa kirjoittaa kahdella laitteella samaan aikaan samaan sarjaporttiin. pistä vaikka Y-haara. Samaan aikaan voi toinen laite lähettää ja toinen lukea, mutta molemmat ei voi kirjoittaa samaan aikaan.

Metabolix [09.06.2011 12:42:11]

#

groovyb, selitäpä sitten, millä magialla esimerkiksi sarjaporttiin kytketty modeemi toimii. Siitähän menee ns. "samaan aikaan" dataa sekä koneelta nettiin että netistä koneelle.

groovyb [09.06.2011 12:49:23]

#

Vaikka säikeillä, toinen luvulle,toinen kirjoitukselle, käyttämällä readytotransfer ja readytoreceiveä, ja lukottamalla. Jolloin modeemi toisessa päässä tietää lähettääkö vai vastaanottaako.

Grez [09.06.2011 12:51:59]

#

groovyb kirjoitti:

Edit, Grez,kokeileppa kirjoittaa kahdella laitteella samaan aikaan samaan sarjaporttiin. pistä vaikka Y-haara. Samaan aikaan voi toinen laite lähettää ja toinen lukea, mutta molemmat ei voi kirjoittaa samaan aikaan.

Sori, mutta pakko kysyä että mitäköhän sä mahdat sekoilla? Onko joku sanonut, että samaan sarjaporttiin voi kytkeä kaksi laitetta yhtä aikaa?

Sitä paitsi väitettäsi, ettei muka voisi lähettää ja vastaanottaa samanaikaisesti on äärimmäisen helppo testata. Pistä sarjaporttiin hyppylanka 2 ja 3 pinnien välille ja avaa terminaali ja kokeile kirjoittaa jotain. Kas kummaa, maagisesti kirjoittamasi teksti tulee sinulle takaisin päin ja tässä todellakin liikkuu täsmälleen samaan aikaan data molempiin suuntiin. Edellinen siis ilman vuonvalvontaa. Mutta toki voit tehdä saman testin CTS/RTS -vuonvalvonnan kanssa, pistät vaan RX/TX -pinnien lisäksi hyppylangan CTS/RTS -pinnien välille.

groovyb kirjoitti:

Jolloin modeemi toisessa päässä tietää lähettääkö vai vastaanottaako.

Lähtökohtaisesti modeemi vastaanottaa ja lähettää samanaikaisesti. Ei ole mitään erillistä vastaanotto tai lähetystilaa (ellei nyt puhuta jostain 1960-luvun half duplex modeemeista (vaikka 201A), joita kovin moni suomessa ei ole edes käyttänyt).

Toki voi olla, että tietokoneella on puskuri täysi ja se on pyytänyt, että modeemi ei juuri nyt lähettäisi, tai modeemilla puskuri täysi ja se ilmoittaa tietokoneelle ettei vastaanota juuri nyt. Mutta nämä ei liity mitenkään toisiinsa. Sarjaportissa on ikäänkuin lähetys- ja vastaanottokanava, joista kumpi tahansa tai molemmat voi hetkellisesti olla "tukossa", mutta kuitenkin täysin toisistaan riippumatta.

groovyb [09.06.2011 13:49:10]

#

no terminaali nyt on huono esimerkki, koska eikö se toimi asynkronisesti?
luku on päällä koko ajan, paitsi kun kirjoittaa. ja kun kirjoitus on ohi, palataan lukemaan?

olen aina luullut ett SSP eli Synchronous serialport on hieman eri kuin tavallinen comport, koska SSP:ssä mennään neljällä piuhalla (3 + 1), asynkronisessa kolmella (2 + 1).

Sarjaportti perustuu UART:iin (Universal Asynchronous Receiver/Transmitter), jolla et voi samaan aikaan kirjoittaa ja lukea, as in Synchronous.

Grez [09.06.2011 14:01:17]

#

Mistä hatusta sä näitä juttuja oikein vedät? Siis ei millään pahalla, mutta ihmettelen vaan että on vahva näkemys asioista vaikka minusta ei mitenkään voi pitää paikkaansa. Eli missä yhteydessä olet törmännyt näihin asioihin joista kirjoitat?

groovyb kirjoitti:

no terminaali nyt on huono esimerkki, koska eikö se toimi asynkronisesti?
luku on päällä koko ajan, paitsi kun kirjoittaa. ja kun kirjoitus on ohi, palataan lukemaan?

Normaalisti se toimii niin että luku on päällä koko ajan ja kun käyttäjältä tulee syötettä, niin se kirjoitetaan saman tien porttiin. Siis kirjoittamisen ajaksi ei tarvitse "lopettaa" lukemista. Tai näin ainakin niissä ympäristöissä, joissa olen koodannut itse ja tutkiskellut muiden tekemiä terminaaliohjelmia (32-bit ja 64-bit Windows, Windows CE, OS/2 ja DOS)

Jos et usko minua, niin lataa vaikka Microsoftin TTY-esimerkkikoodi C++:lle.

Jos nyt puhut ihan rautatasolla (eli että ei olisi mitään laiteajuria välissä) ja moniajokäyttöjärjestelmästä, niin tietenkään kaksi prosessia tai säiettä ei voi samanaikaisesti veivailla laitetason rekistereitä ristiin, jossa tapauksessa toisen säikeen tai prosessin pitäisi lukita sarjaportti itselleen. Tosin jos tästä puhuit niin meni aika paljon ohi aiheen, kun ketjussa puhuttiin kuitenkin Windowsissa toimivasta ohjelmasta. Ja toisaalta sama lukitus täytyisi tehdä myöskin jos kaksi säiettä haluaa lukea tai kaksi säiettä haluaa kirjoittaa eikä vain jos toinen haluaa lukea ja toinen kirjoittaa.

groovyb kirjoitti:

olen aina luullut ett SSP eli Synchronous serialport on hieman eri kuin tavallinen comport, koska SSP:ssä mennään neljällä piuhalla, asynkronisessa kahdella (plus maa).

Mistä sä nyt tuon SSP:n repäisit keskusteluun mukaan? Otetaanko vielä SPI ja I2C mukaan? I2C:ssä ei tosiaan voi kuin lähettää tai vastaanottaa samanaikaisesti.

Normaalissa sarjaportissa (josta tässä on kaiken järjen mukaan koko ajan ollut kyse, eli mikä PC:stä löytyy, RS-232) mennään vähintään kolmella piuhalla (maa, TX, RX) ja lisäksi jos halutaan laitetason vuonvalvonta tulee CTS ja RTS. Normaalisti on lisäksi DTE, DTR ja DSR, jotka kertovat että vastapuolen laite on kytkettynä ja päällä. Lisäksi modeemin tapauksessa on usein RI joka kertoo saapuvasta puhelusta, joskin yleensä ohjelmat ei käytä sitä vaan odottelee RING-tekstiä.

groovyb [09.06.2011 14:10:55]

#

no idea oli että samaan aikaan et voi lukea ja kirjoittaa sarjaporttiin, tämä tuli hyvinkin tutuksi automaatioprojekteissa missä piti synkronissa asioita tehdä.

Artolle ideana oli lyhyesti se, että Kun lukee ja kirjoittaa (jos on yhteyden avaamiset ja sulkemiset aina lukufunktiossa ja kirjoitusfunktiossa),tarkastaa isOpenilla (koska siitä ei välttämättä exceptionia tule), ja pistää timeoutin, koska jos bufferi on ummessa tai luku/kirjoitus on vielä kesken, tulee tilttiä.
Tämä johtuu taasen nopeudesta, koska jos vaikka kirjoittelee 9600bps nopeudella, yksi kirjain siirtyy ehkä millisekunnissa, ohjelmakierto tapahtuu sinä aikana varmasti useastikin.

ja metabolixille vastasin siihen että miksei voi samaan aikaan lukea ja kirjoittaa. koska sarjaportti on async. full duplex on, mutta async full duplex.

Ehkä tartun hiukan tiiviisti "Samaan aikaan" -termiin, on tullut vain vuosien saatossa synkkaamisen kanssa taistelua riittämiin.

Grez [09.06.2011 14:14:40]

#

groovyb kirjoitti:

no idea oli että samaan aikaan et voi lukea ja kirjoittaa sarjaporttiin, tämä tuli hyvinkin tutuksi automaatioprojekteissa missä piti synkronissa asioita tehdä.

Se että jokin automaatiolaite on erikoisesti rajoittunut ei nähdäkseni liity mitenkään aiheeseen.

Ja tarkista nyt ihmeessä mitä asynkroninen vs. synkroninen tarkoittaa.

Asynkroninen tarkoittaa sitä, että ei käytetä kellosignaalia, ja siinä voi tulla epämääräisen pituisia taukoja lähetettävien tavujen välissä. Synkronisessa taas mennään kellosignaalin tahdissa. Nämä ei liity millään tavalla dupleksisuuteen. Synkroninen voi olla half duplex tai full duplex samoin kuin asynkroninen.

groovyb kirjoitti:

Ehkä tartun hiukan tiiviisti "Samaan aikaan" -termiin, on tullut vain vuosien saatossa synkkaamisen kanssa taistelua riittämiin.

Voi olla että on tullut taisteltua, mutta kyseessä ei ole mikään normaalin sarjaportin rajoitus. Voin lyödä ihan mistä tahansa summasta vetoa, että normaalissa sarjaportissa voi lähettää ja vastaanottaa täysin samaan aikaan ilman mitään ongelmia.

Jos riittävän suuren summan olet valmis häviämään niin voin tulla vaikka demoamaan läppärin, modeemin ja oskilloskoopin kanssa. :D Voit sitten siinä kun bittiä menee koko ajan molempiin suuntiin kertoa, missä vaiheessa modeemi on "lähetystilassa" milloin "vastaanottotilassa".

groovyb [09.06.2011 14:17:49]

#

Tiedän kyllä. Mutta full duplex ei tarkoita automaattisesti samanaikaisuutta itse kommunikoinnissa, vaikka viestin voi lähettääkkin.

Grez [09.06.2011 14:21:30]

#

groovyb kirjoitti:

Tiedän kyllä. Mutta full duplex ei tarkoita automaattisesti samanaikaisuutta itse kommunikoinnissa, vaikka viestin voi lähettääkkin.

No ei, mutta normaalissa sarjaportissa se nyt on kuitenkin samanaikaista, ja normaalin sarjaportin asynkronisuuden käyttäminen perusteluna, ettei näin olisi on hieman absurdia.

groovyb [09.06.2011 14:25:05]

#

No normaali sarjaportti on UART pohjainen. eli asynkroninen.


--edit--

on eriasia jos PC:n sarjaportti eivät todellisuudessa olekaan sarjaportti, vaan USB -> sarjaporttikikkareita. Nämä ovat tosiaan yleistyneet vauhdilla.

Grez [09.06.2011 14:26:30]

#

groovyb kirjoitti:

No normaali sarjaportti on UART pohjainen. eli asynkroninen.

Tiedän, mutta kuten sanoin, se ei liity mitenkään asiaan. Eli siihen vetoaminen on mielestäni absurdia.

groovyb kirjoitti:

--edit--

on eriasia jos PC:n sarjaportti eivät todellisuudessa olekaan sarjaportti, vaan USB -> sarjaporttikikkareita. Nämä ovat tosiaan yleistyneet vauhdilla.

Joo, USB-sarjaportissa on oikeasti jopa mahdollista että ei pysty lähettämään ja vastaanottamaan yhtä aikaa, toisin kuin perinteisesssä UART-pohjaisissa sarjaporteissa. Mutta tämä johtuu vaan siitä, että ko. USB-sarjaporttikikkare on onnettomasti toteutettu ja todennäköisesti ei toimi kunnolla useimmissa sarjaportin käyttötarkoituksissa. Se että markkinoilla on viallisia tuotteita ei mielestäni ole mikään järkevä perustelu väitteellesi.

groovyb [09.06.2011 14:37:18]

#

Jos nyt oikeasti lähdetään viilaamaan, niin pystytkö tekemään samanaikaisen kommunikaation uartilla, ilman Clock synciä?, Et. Siinä perustelu väitteelle.

Jos joku ei ole synkroninen, se ei ole samanaikainen.

Se että voit full duplexilla kirjoittaa ja lukea, ei tee siitä samanaikaista, se vaan simuloi samanaikaista.

USB kikkareissa on tosiaan se heikko puoli että ne on aika paskoja, mutta se ei poistä sitä tosiasiaa että todella moni halpiskone nykyään sellaisen sisältää. (Mutta se paskuus tosiaan tulee eri asioista, jo pelkästään halvimmissa olevat kiinteät TTL tasot tekee siitä paskan, ja rajoittaa käyttöä joidenkin ulkoisten laitteiden kanssa)

Torgo [09.06.2011 14:51:24]

#

En ole jaksanut lukea koko ketjua läpi, joten olen väittelystänne hieman pihalla, mutta heitän nyt kuitenkin jotain kommenttia väliin.

groovyb kirjoitti:

No normaali sarjaportti on UART pohjainen. eli asynkroninen.

Nykypäivänä käyttävät pääasiassa USART-lohkoja, eli voi käyttää kumpana tahansa.

groovyb kirjoitti:

Se että voit full duplexilla kirjoittaa ja lukea, ei tee siitä samanaikaista, se vaan simuloi samanaikaista.

En täysin ymmärrä mitä ajat takaa. Full duplex nimenomaan tarkoittaa, että voit sekä lähettää että vastaanottaa dataa samaan aikaan. Ei ole kysymys mistään simulaatiosta, vaan ihan fyysisesti reaalimaailmassa tapahtuvasta todellisesta tilanteesta. Half duplexilla puolestaan voidaan simuloida samanaikaista lähetystä ja vastaanottoa, mutta reaalimaailmassa lähetys ja vastaanotto tapahtuvat vuorotellen.

groovyb kirjoitti:

USB kikkareissa ... jo pelkästään halvimmissa olevat kiinteät TTL tasot tekee siitä paskan

Ei halvimmissa, vaan kaikissa. USB standardi määrää että jännite on oltava TTL tasolla (5V +/- 0,25V). Jos jossain on tästä poikkeava jännite, on kyseessä standardista poikkeava, rajattuun käyttöön tarkoitettu muunnelma.

Grez [09.06.2011 14:53:26]

#

Edit:
Muokkasin tätä viestiä niin, että käytän johdonmukaisesti seuraavia termejä

Tahdistettu = saman kellon tahdissa toimiva, synkroninen
Samanaikainen = päällekkäin toistensa kanssa tapahtuva

groovyb kirjoitti:

Jos nyt oikeasti lähdetään viilaamaan, niin pystytkö tekemään samanaikaisen kommunikaation uartilla, ilman Clock synciä?, Et. Siinä perustelu väitteelle.

Joo, siinä on perustelu väitteelle, että sarjaportti ei ole synkroninen. No, kukaan ei ole väittänyt sarjaportin olevan synkroninen. Joten edelleen minusta absurdia yrittää perustella omia muita väitteitäsi sillä.

Eli kysehän oli siitä, voiko sinne kirjoittaa samaan aikaan kuin sieltä luetaan. Siellä ei ole väittämääsi rajoitetta, joka estäisi kirjoittamisen samalla kuin luetaan. Tai että jokin (muu kuin huonosti suunniteltu automaatiolaite) menisi rikki jos sinne kirjoitetaan jos lukeminen on käynnissä. Voit ihan vapaasti kirjoittaa vaikka täsmälleen samaan aikaan kun toisesta päästä aletaan kirjoittamaan jos haluat (implementoimalla clock syncin) tai voit tökätä sen hyppylangan RX ja TX-pinnien väliin, jolloin ne on synkroniset eikä sarjaportti pane tällöinkään hanttiin.

En ole missään vaiheessa sanonut, että kirjoitus ja luku olisi synkronissa, vaan sitä, että lukeminen ei millään tavalla estä kirjoittamista.

groovyb kirjoitti:

Jos joku ei ole synkroninen, se ei ole samanaikainen.

Asynkroninen voi olla silloin tällöin samassa tahdissa ja silloin tällöin eri tahdissa. Tästä nyt ei ollut missään vaiheessa kyse, että ovatko ne tavut tai bitit täsmälleen saman kellon tahdissa vaan siitä, että voitko kirjoittaa sarjaporttiin samaan aikaan kun sieltä on tulossa dataa. Ja todennäköisesti jos mitään synkronointia ei ole, ne aina silloin tällöin jopa menee samassa tahdissa.

groovyb kirjoitti:

Se että voit full duplexilla kirjoittaa ja lukea, ei tee siitä samanaikaista, se vaan simuloi samanaikaista.

Onkohan sinulla full duplexin käsite hieman sekaisin. Ei se ole mikään half duplexin päälle liimattu viritys jolla simuloidaan samanaikaista lähettämistä. Tilanne normaalissa sarjaportissa vastaa sitä kuin sinulla olisi kaksi puutarhaletkua joissa menee vettä eri suuntiin. Toisessa voi mennä ehkä hieman hitaammin ja eri tahdissa kuin toisessa mutta silti kummassakin voi liikkua vettä samanaikaisesti.

Ja tässähän ei aluksi ollut edes mitään puhetta synkronisuudesta, vaan toit sen keskusteluun myöhemmin mukaan. En ole missään vaiheessa väittänyt, että asynkroninen portti olisi synkroninen. Olet itse kehittänyt jonkun paikkansapitämättömän hypoteesin, että molempiin suuntiin ei ole mahdollista lähettää samaan aikaan, elleivät lähetykset ole synkronisia. Itse väitit että modeemin pitäisi tietää milloin se on lähetystilassa ja milloin vastaanottotilassa. Todellisuudessa tällaisia tiloja ei ole vaan modeemi voi vastaanottaa aina kun vastaanottoputkessa on tilaa ja lähettää aina kun lähetysputkessa on tilaa. Eli lähetysputkea ei voisi vähempää kiinnostaa vastaanottoputken tila ja päin vastoin.

Torgo kirjoitti:

Ei halvimmissa, vaan kaikissa. USB standardi määrää että jännite on oltava TTL tasolla (5V +/- 0,25V). Jos jossain on tästä poikkeava jännite, on kyseessä standardista poikkeava, rajattuun käyttöön tarkoitettu muunnelma.

Oli puhe USB-RS232 -sovittimissa. Huonoissa sellaisissa se niinsanottu RS232:kin on 0V ja 5V tasolla. Laadukkaissa on tasomuunnin, jonka ansiosta se ymmärtää ja lähettää RS232 standardin mukaisia jännitetasoja, eli lähetettäessä 1 on -5V - -15V ja 0 on +5V - +15V. Vastaanotettaessa -3V - -25V pitäisi tulkita 1:ksi ja +3V - +25V pitäisi tulkita 0:ksi. -3V - +3V on epäkelpo alkuperäisessä standardissa, mutta useimmat laitteet on nykyään tehty ymmärtämään myös -3V - 0V 1:ksi.

Huvittavaa muuten, että noissa huonoissa TTL-tasoa ulos antavissakin on usein muunninpiiri, mutta on säästetty ja jätetty laittamatta keraamiset kondensaattorit (hinnaltaan yhteensä noin 0,1€), joita se tarvitsee generoidakseen korkeammat ja negatiiviset jännitteet. Itselläni on muutama tuollainen, ja niissä on jopa paikat piirilevyllä. Eli jos juottelisi itse kerkot niihin, niin saisi kunnollisen.

Torgo [09.06.2011 15:31:31]

#

Grez kirjoitti:

Huvittavaa muuten, että noissa huonoissa TTL-tasoa ulos antavissakin on usein muunninpiiri, mutta on säästetty ja jätetty laittamatta keraamiset kondensaattorit (hinnaltaan yhteensä noin 0,1€), joita se tarvitsee generoidakseen korkeammat ja negatiiviset jännitteet. Itselläni on muutama tuollainen, ja niissä on jopa paikat piirilevyllä. Eli jos juottelisi itse kerkot niihin, niin saisi kunnollisen.

Näinhän se menee. Ensin insinöörit suunnittelevat kunnollisen laitteen. Sitten talousosasto sanoo, että valmistaminen ja/tai materiaalit maksavat niin ja niin paljon liikaa. Sitten ruksitaan skemasta osia yli konkista aloittaen. Koskee aika monta muutakin laitetta, kuin näitä sarjaliikenneadaptereita.

Grez [09.06.2011 15:37:55]

#

Voihan se olla että toi on jopa suunniteltu tuollaiseksi huonoksi, mutta tehty piirilevylle valmiiksi paikat, niin ei tarvitse valmistuttaa uusia piirilevyjä vaikka seuraava asiakas tilaisi niitä kunnollisena mallina.

Tuntuu että kiinalaiset on erikoistuneet erilaisiin kikkoihin että saa tehtyä halvalla. Joskus kikat on ihan järjettömiä ja jollain älykkäämmällä tavalla saisi paremman vieläkin halvemmalla.

Arto [09.06.2011 17:23:47]

#

niin siis tässä linkissä oleva koodi toimii toisinaan hyvin toisinaan hyvin huonosti (kone menee ihan tilttiin), eikös tämä nyt ole joku API:n avulla tehty koodi??

neau33 kirjoitti:

Moi Arto!

tsekkaa tämä

koneessani on windows 7 64bit ja tää on se pillaantunu versio HOME premium. lisäks Office 2010

Äläkää hyvät ihmiset tapella, tavan taapero (minä) tipuin kärriltä vaikka olen jonkun verran tehnyt PIC, piirien usart liitäntöjä. ne on toistaiseksi toimineet keskenään hyvin.

nii siis minunhan ei tässä ohjelmassa tarvitse kirjoittaa GPS:lle mitään, kun vaan saan linjan auki niin tietoo tule itsestään noin 1 sek. välein. tuntematta tietokoneen virtuaali portin toimintaa tarkemmin ajattelin että homma sekoaa siinä kun luen muuttujaa,johon portista tullut tieto on tallennettu, ja samaan aikaan joku tallentaa "portista" tulevaa dataa juuri samaan aikaan. Ainakaan PIC piirit eivät tästä tykkää, tosin ei kyllä ole niissä mahdollista tehdäkkään ihan perus kikkareilla.

nii ja sitte toi rekisteri homma mikä ei toiminu tässä niin löyttyy tuosta NEAn myöhemmästä postauksesta. missä puhutaan MSComm32 jutusta.

ErroR++ [09.06.2011 18:41:45]

#

Arto kirjoitti:

Ööö tarkoitat tällä mitä?? eli jotenkinhan se paikka, pituus ja leveys asteet täytyy tuolta onkia esille että pääsee laskemaan. paikka tieto löytyy riviltä

$GPGGA,XXXXXX.XXX,XXXX.XXXX,X,XXXXX.XXXX,X,X,XX,​X.X,XXX.X,X,XX.X,X,,XXXX*X
toinen numero löytyy 2. ja 3. pilkun välistä ja toinen 4. ja 5. pilkun välistä.

mut eikös tää tästä lähre instr komennolla aukeemaan, eli etsin tuon $GPGGA:n ja saan tiedon missä kohtaa se on siihen lisään ~10 ja lähen siirtämään tästä merkki kerrallaan toiseen stringgiin ja sitten stringi long muotoon ja laskemaan.

noin periaatteessa....

Niin tarkoitan että se tieto joka sieltä tulee niin laitetaan

Arto kirjoitti:

strinngin

sijasta object:iin.

neau33 [23.06.2011 11:17:27]

#

Moi taas Arto!

'tutki hieman oheista viritelmään ja sovella...

Private Sub ShowGPSData(gpsArray As Variant, IsMulti As Boolean)

   Dim i As Integer
   Dim arraylen As Integer

   Select Case IsMulti
      'tapauksessa että parametrin
      'IsMulti arvo on EPÄTOSI niin...
      Case False
         'käydään laskurisilmukassa läpi parametrin
         'gpsArray taulukon kaikki alkiot...
         For i = LBound(gpsArray) To UBound(gpsArray)
            'jos laskurin i osoitaman alkioindeksin
            'merkkijono ei ole tyhjä niin...
            If Trim(gpsArray(i)) <> "" Then

               'muutama esimerkki stringin käsittelystä
               'poistaa kaikki pisteet
               'gpsArray(i) = Replace(gpsArray(i),".","")

               'poistaa merkit oikealta alkaen pisteestä
               'If InStr(gpsArray(i), ".") > 1 Then
                  'gpsArray(i) = Left(gpsArray(i), InStr(gpsArray(i), ".") - 1)
               'End If

               'poistaa merkit vasemmalta alkaen pisteestä
               'If InStr(gpsArray(i), ".") > 1 Then
                  'gpsArray(i) = Right(gpsArray(i), Len(gpsArray(i)) - InStr(gpsArray(i), "."))
               'End If

               'näytetään taulukon laskurin i
               'osoittaman alkioindeksi merkkijono
               MsgBox gpsArray(i)

            End If
         Next i
      Case True
         'tapauksessa että parametrin
         'IsMulti arvo on TOSI niin...

         'märiteään laskurin i osoittaman
         'arvon perusteella taulukon gpsArray
         'ensimmäisen ulottuvuuden indeksi...
         For i = LBound(gpsArray, 1) To UBound(gpsArray, 1)
            Dim j As Integer
            'ja laskurin j osoittaman arvon
            'perusteella taulukon gpsArray
            'toisen ulottuvuuden indeksi...
            For j = LBound(gpsArray, 2) To UBound(gpsArray, 2)
               If Trim(gpsArray(i, j)) <> "" Then
                  'ja näytetään lakuriarvojen
                  'perusteella ko. alkion
                  'sisältämä merkkijono.
                  MsgBox gpsArray(i, j)
               End If
            Next j
         Next i
   End Select

End Sub

Private Sub Timer1_Timer()

   Dim retArray As Variant
   Dim IsMulti As Boolean
   Dim PlaceD As String

   PlaceD = PlaceD = MSComm1.Input

   If InStr(PlaceD, vbCrLf) > 0 Then

      Dim i As Integer, j As Integer
      Dim cnt As Integer: cnt = -1
      Dim tmpArray() As String
      'jos muuttujan PlaceD merkkijono sisältää
      'rivinvihtomerkkejä niin splitataan muutujan
      'merkkijono string taulukkoon (tmpArray)
      tmpArray = Split(PlaceD, vbCrLf)

      'alustetaan kasiolotteinen merkkijono taulukko
      'ja määritetään taulukon ensimäisen ulottuvuuden
      'kooksi merkkijonotaulukon (tmpArray) koko ja
      'ja toisen ulottuvuuden kooksi 0 (yksi alkioindeksi)
      ReDim gpsArray(UBound(tmpArray), 0) As String

      For i = LBound(tmpArray) To UBound(tmpArray)
         'jos taulukkon tmpArray laskuriarvon i
         'osottaman alkion merkkijono sisältää
         'merkkijonon "$GPGGA"  niin...
         If InStr(tmpArray(i), "$GPGGA") > 0 Then
            'jos samaisen alkion merkkijono
            'sisältää pilkkuja niin splitataan
            'alkion merkkijono string taulukkoon (tmp2Array)
            If InStr(tmpArray(i), ",") > 0 Then
               Dim tmp2Array() As String
               tmp2Array = Split(tmpArray(i), ",")


               'asetetaan integer tyypisen muuttujan arvoksi
               'merkkijonotalukon gpsArray toisen ulottuvuuden
               'koko + merkkijonotaulukon tmp2array koko...
               cnt = UBound(gpsArray, 2) + UBound(tmp2Array)

               'kasvatetaan jokaisella laskurin (i) kierrkosella
               'merkkijonotaulukon gpsArray toisen ulottuvuuden
               'kokoa edellämääritetyn muutujan (cnt) arvolla
               ReDim Preserve gpsArray(UBound(gpsArray, 1), cnt)
               For j = LBound(tmp2Array) To UBound(tmp2Array)
                  'asetetaan taulukon, laskurien i ja j
                  'osoittaman alkioindeksin arvoksi
                  'taulukon tmp2Array laskurin j osittaman
                  'alkioindeksin merkkijonoarvo
                  gpsArray(i, j) = tmp2Array(j)
               Next j
               'pyhkäistään aputaulukko tmp2Array muistista
               Erase tmp2Array
            End If
         End If
      Next i

      'jos merkkijonotaulukon gpsArray
      'toisen ulottuvuuden koko on 0
      If UBound(gpsArray, 2) = 0 Then
         'niin ilmoitetaan käyttäjälle
         'että GPS dataa ei ole...
         MsgBox "Ei GPS dataa!"
         'poistetaan taulukot muistista
         Erase tmpArray, gpsArray
         'ja poistutaan aliohjelmasta.
         Exit Sub
      End If
      asetetaan palautuobjektin

      'asetetaan varian tyyppisen muuttujan
      '(retArray) arvoksi taulukko (gpsArray)
      retArray = gpsArray

      'kutsutaan aliohjelmaa ShowGPSData
      'ja välitetään aliohjelmalle parametreinä
      'variant muuttuja retArray ja boolen
      'operaattorin arvo TRUE joka ilmoittaa
      'aliohjelmalle tässä tapauksessa, että
      'ensimmäinen paramtriarvo sisältää
      'kaksiulotteisen taulukon...

      GPSDataShow retArray, True
      'pyhkäistään taulukot muistista
      Erase tmpArray, gpsArray, retArray
   Else
      'Jos muuttujan PlaceD merkkijono ei
      'sisältänyt rivinvaihtomerkkejä niin
      'tutkitaan sisältääkö merkkijono
      '"$GPGGA" merkkijonon...
      If InStr(PlaceD, "$GPGGA") > 0 Then

         'ja jos merkkijono sisältää pilkun
         If InStr(PlaceD, ",") > 0 Then
            'splitataan merkkijono variant
            'muuttujaan retArray...
            retArray = Split(PlaceD, ",")
            'kutsataan aliohjelmaa ShowGPSData
            'välitetään aliohjelmalle parametreinä
            'variant muuttuja retArray ja boolen
            'operaattorin arvo FALSE joka ilmoittaa
            'aliohjelmalle tässä tapauksessa, että
            'ensimmäinen paramtriarvo sisältää
            'yksiulotteisen merkkijonotaulukon.
            ShowGPSData retArray, False
            Erase retArray
         Else
            'jos merkkijono ei sisältänyt pilkkua
            'niin ilmoitetaan käyttäjälle, että
            'GPS dataa ei ole
            MsgBox "Ei GPS dataa!"
         End If
      Else
         'jos merkkijono ei sisältänyt
         '"$GPGGA" merkkijonona niin
         'ilmoitetaan käyttäjälle, että
         'GPS dataa ei ole
         MsgBox "Ei GPS dataa!"
      End If
   End If

End Sub

Sivun alkuun

Vastaus

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

Tietoa sivustosta