Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

Chybny prenos dat, com port, CreateFile, ReadFile

XYzacatecnik (8)|10.12.2008 10:38
Dobry den,
snazim se nacitat data z gps modulu do me aplikace (vyvijene v eMbedded Visual C++ 4.0
) pro pda (HP,ipaq - 114, WM6) pres bluetooth. Nekdy data nactu bez problemu, jindy nacitam prazdna data. Ac jsou zarizeni sparovana, spojeni je aktivni, com port vytvoreny, data odesilana. Prodleva mezi uspesnym a neuspesnym nacitanim je rozdilna (napr. 1hod-3dny).

V aplikaci klasicky vyuzivam fce win api: handle=CreateFile(L"COM6:"...,, dale fce na nastaveni parametru serioveho prenosu, a fci ReadFile, vystupem je retezec do MessegeBoxu z ReadFile.
Nikdy nenastane nejaka sys. chyba, handle na soubor (port) se uspesne vytvori, readfile uspesne nacte data (nekdy bohuzel ale prazdna). Samozrejme jsem testoval i jine aplikace pracujici s nacitanim dat z GPS a problem nemaji (napr. miniGPSviewer). Port (COM6) volim spravny, testoval jsem ruzne modifikace nazvu portu ("COM6:","COM6","\\\\.\\COM6","\\\\.\\COM6:","\\.\COM6", apod.), uspel pouze "COM6:". Samozrejme ze pokud gps modul vypnu, com port se aplikaci nepovede vytvorit, tudiz predpokladam, ze propojeni je spravne. Otazkou je tedy proc ReadFile nekdy nacita prazdna data. Mam nejak adresovat zarizeni bloutooth, nebo mam vyuzivat nejake BT knihovny? Mozna by bylo nejake reseni pres sockety? Ale teto variante bych se radeji vyhnul.

S timto problemem se "morim" uz pomerne dlouho, zkousel preinstalovat ROM, sehnat lepsi, popr. jine ovladace na bluetooth, ale uz si opravdu nevim rady.
Budu velice vdecny za jakoukoliv radu. Dekuji.
RStein (2012)|10.12.2008 11:51
Dobry den,
Nevim, jestli pochopil zcela, s cim mate problem.

1) Jestlize je vasim jedinym problemem to, ze obcas GPS vraci prazdna data, tak je jednoduse ignorujte - pokued vracene bajty nepredstavuji NMEA retezec (nezacinaji $GPRMC apod.)
2) Vite, ze od Windows Mobile 5 existuje intermediate driver pro GPS? To znamena, ze nemusite sam otvirat port pres CreateFile, ale pouzijete API GPSOpenDevice, GPSCloseDevice, GPSGetPosition a GPSGetDeviceState. Nevim, ale jak je to nyni u HP, HP drive pouzival pro BT Widcomm, coz vse trochu komplikuje.
Ani GPS API ale neni bez problemu - viz moje prednaska http://jdem.cz/ajah6
3) Mluvite o nastaveni COM portu - nekoliduje vase nastavani s nastavenim intermediate driveru? Zkusil jste jen otevrit port a nesnazit se zarizeni vnutit nejake nesmyslna a odhadovana nastaveni COM portu?

4) HP zarizeni s Widcomm stackem mely drive problemy se stabilitou driveru - napr. pri odstreleni nastaveni bluetooth (pouze UI), prestal chodit i driver pro bluetooth a GPS se odppojila.

Pres winsock komunikovat lze, ale je to o neco slozitejsi, nez jednoduche otevreni COM portu.
XYzacatecnik (8)|10.12.2008 12:27
Dekuji za odpoved (paralelne na foru builder.cz)

1)GPS nevraci obcas prazdna data (tedy mezi hodnotnymi retezci reps. vetemi dle protokolu NMEA, tak jak jste me pochopil). GPS nebo spis readfile vraci treba hodinu testovaní SOUSTAVNE prazdny retezec a potom se neco stane (bez meho vlivu) a nejednou zacne vse chodit dle predpokladu (chodi mi plnohodnotna data urcena k "parsovani") a o neco pozdeji zase nastane doba, kdy chodi zase soustavne pouze prazdna data...

2)API GPS fce jsem neznal, sice by mela ma mini aplikace fungovat i pod WM2003, ale urcite vyzkousim.

3)Toto by mohl byt zdroj problemu. Nastavuji prenosovou rychlost, paritu, stopbit, velikost jednoho bytu, ostatni standardne. Mnou zadavane paremetry jsem testoval resp. zjistoval prvne na pc aplikaci hyperterminal a nasledne v uvedenem mini gps vieweru pro ppc. Je tedy pravda, ze aplikaci mini gps viewer se take chova ponekud zvlastne, po nejake dobe se sama ukonci (uplne ukonci). Ze strany vyrobce gps modulu nejsou poskytovany zadne informce pro doporucene nastaveni prenosu (EVOLVE). Tedy pokud neni nutne parametry prenosu nastavovat, vyzkousim bez...

4)O podobnych problemech jsem se take docetl. V mem pripade je dale gps pripojena, spojeni je aktivni.

Ano winsock bych se rad z tohoto duvodu vyhnul.

Dekuji
RStein (2012)|10.12.2008 12:31
Zustaneme jen na ce4you? :)

Jeste k bodu 3) U GPS intermediate driveru zalezi na tom, za pristupujete na fyzicky (HW) nebo SW port. U SW portu na nastaveni nesejde - intermediate driver pouze simuluje dalsi COM port. Pokud se ale bijete s intermediate driverem o GPS, tak vysledky volani mohou byt opravdu nedefinovatelne. I kdyz spis by HW port mel jiz byt obsazen a Vy byste mel dostat chybu pri pokusu o pristup.
XYzacatecnik (8)|10.12.2008 14:28
Zustaneme u ce4you:)

Zkousel jsem spustit opraveny kod bez nastaveni parametru prenosu a stale se nedari, budu tedy muset opravdu asi volit cestu gps api fci. Mimochodem k GPS intermidiate driveru je pridelena utilita "Externi GPS" v nabidce nastaveni, zalozce system?
V tomto jsem zkousel take ruzne prednastavovat COM port (tedy hlavne ten hardwarovy) a take bez uspechu. Jeste jsem take resil, ze v nastaveni serioveho portu Bluetooth ve volbe Nastaveni Bluetooth je prichozi COM port 5 a odchozi COM 6. Kazdopadne mini GPS viewer cte data jen z COM 6 a dalsi obdobna aplikace take. Kdyz v me aplikaci nastavim, ze chci cist z portu 5, vraci se INVALID_HANDLE_VALUE, tudiz jsem celou dobu usuzoval, ze spravny COM port je 6. Nemuze byt problem nekde v tomto? Dekuji.
RStein (2012)|10.12.2008 14:43
Ano, ten an applet se vetsinou jmenuje externi GPS. HW port by mel byt COM6 (pres nej asi fyzicky na BT komunikujete - v tom bych problem nevidel, terminologie Ingoing a Outgoing port je matouci :) ).
Zkusil jste z aplikace otevrit ten nastaveny SW port?
XYzacatecnik (8)|10.12.2008 15:01
Ano, mam HW port nastaven na COM6 a ve sve aplikaci v CreateFile take COM6, data stale neprichazeji. Pokud je gps modul zapnut ReadFile vrati prazdny retezec (spojeni je aktivni), pokud je modul vypnut, CreateFile vrati INVALID_HANDLE_VALUE a ReadFile false (spojeni neni aktivni). Dekuji.
RStein (2012)|10.12.2008 15:06
Asi jsme si nerozumeli - v appletu je hned prvni zalozka Programy, kde vyberete VOLNY COM port , na ktery se pripojite (uz se nebudete pripojovat na "FYZICKY-BT emulaci" HW portu, ale pripojite se na sdileny COM port). V appletu na posledni zalozce Pristup musi byt take zatrzeno Spravovat zarizeni GPS automaticky.

Pokud Vam to nepujde, zkuste take Intermediate driver vypnout - zruste zaskrtnuti u Spravovat zarieni GPS automaticky a pripojte se na fyzicky port COM6 (ted uz o nej nebudete souperit s driverem).
RStein (2012)|10.12.2008 15:25
A jeste pro jistotu - nazev SW portu si zkontrolujte v registrech HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Multiplexer:DriverInterface.
Nektera zarizeni, se kterymi jsem pracoval, pouzivala prefix GPD a ne COM.
XYzacatecnik (8)|10.12.2008 16:20
Registr jsem zkontroloval HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Multiplexer:ActiveDevice je nastaven prefix na COM (posledni sekce neni DriverIterface tak jak u Vas ale ActiveDevice.

Vyse uvedene jsem take otestoval. Nevim, jestli Vam rozumim, co myslite pojmem vybrat VOLNY COM port, bud muzu vybrat zadny nebo 0-9 COm (takze spise to,ze?), vyzkousel jsem kazdopadne vsechny varianty a zadna nebyla uspesna. Program reaguje stale stejne. Handle se vytvori pouze na port COM6: a nic jineho, volba v appletu nijak vysledek neovlivnuje.

Zatim se mi vubec nezadarilo alespon na nejekou dobu data nacitat, tak jak v minulosti.

Dekuji za venovany cas.
RStein (2012)|10.12.2008 16:31
K nastaveni: ActiveDevice je dalsi klic
Pod HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Multiplexer musite mit hodnotu DriverInterface. COM4 apod.
Volnym COM portem myslim COM port, ktery nekoliduje s dalsimi COM porty v zarizeni. Muze se Vam stat, ze treba COM2 je jiz obsazen, ale vy ho vvyberete ze seznamu.

Zkousel jste po zmene hodnot soft reset (vypnuti zarizeni pres tlacitko On/Off, aby se ulozily zmeny v registrech), abyste donutil driver hodnoty znovu nacist - i kdyz by GPS driver na kazdem zarizeni mel dostat proikaz IOCTL_REFRESH?

Kdyz rikate, ze jste nenacetl zadna data? Co presne se vam tedy vraci? ReadFile nevraci "nic" nebo nejaky nesmysl? Zkusil jste cist data, kdyz GPS mela fix?
Zkusil jste i tu variantu s uplnym vyrazenim Intermediate driveru? Nebo se zkusit dostat k datum pres GPSOpen?
XYzacatecnik (8)|10.12.2008 18:02
Nyni je hodnota DriverInterface COM6. Prenastavovani jsem zkousel i se soft resetem. I variantu s vyrazenim Intermediate driveru jsem testoval .

ReadFile vrati true, retezec do ktereho ReadFile nacita je stejny jako pri definici tj.
WCHAR str[83]=L"STR:Žádná data k dispozici!"; a z MessageBoxu vyleze neprepsany retezec tj."STR:Žádná data k dispozici!" Ale jak jsem uvadel, nekdy to funguje a normalne z toho dostavam plnohodnotne vety k parsovani, ktere jsem uz i vyparsoval a v realu vyzkousel.:-/

Pustim se tedy do varianty GPSOpen...
RStein (2012)|10.12.2008 18:12
No pokud dostavate smysluplne hlasky, tak vam GSPS intermediate driver funguje ne? Pouze nemate FIX a intermediate driver Vam prozatim nema, co vratit? Tezko by Vam GPS samotna vracela "zadna data k dispozici".
Update: Uz rozumim, ten retezec jste naplnil Vy? Ja myslel, ze jde o nejakou lokalizovanou hlasku. Muzete sem dat, jak pouzivate ReadFile? Zkontroloval jste lpNumberOfBytesRead, zda vubec bylo neco precteno?
XYzacatecnik (8)|10.12.2008 18:23
To jsme si ted nerozumeli. Byla to ilustrace. Definuji si retezec do ktereho behem inicializace zapisu nejaky text, prave to: "zadna data k dispozici" a ten stejny nezmeny retezec je na vystupu, readfile vrati true, handle se vytvori, spojeni mezi pda a gps modulem je aktivni. Tudiz se nacetla prazdna data. Stejne tak kdyz si vytvorim prazdny retezec, tak po "projiti" readfile je navystupu porad prazdny retezec. Jinak necham gps treba 5min nabihat a potom testuji, takze bych fix uz v te chvili urcite mel mit. Diky.
RStein (2012)|10.12.2008 19:07
1) Napsal jsem pot k prechozimu prispevku, ze uz rozumim tomu, ze retezec je vas.
2_)Fix by mela GPS signalizovat zmenou nejake ledky, takze pak nemusite hadat, zda fix mate.
3) Protoze jsem trochiu deformovan svymi knihovnami, ktere jsem si napsal, tak jsem si ted udelal jednoduchy program, ktery cte data z COM portu

Tohle dostanu ihned po spusteni (nemam fix, castecne cachovana data).

[code]
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,178,,12,,,*42
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,63,270,,23,26,201,,28,,,,31,23,091,*49
$GPGSV,4,4,13,32,82,021,*43
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,177,,12,,,*4D
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,64,271,,23,26,201,,28,,,,31,24,091,*48
$GPGSV,4,4,13,32,82,025,*47
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,177,,12,,,*4D
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,64,271,,23,26,201,,28,,,,31,24,091,*48
$GPGSV,4,4,13,32,82,025,*47
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,177,,12,,,*4D
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,64,271,,23,26,201,,28,,,,31,24,091,*48
$GPGSV,4,4,13,32,82,025,*47
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,4,1,13,04,,,,05,,,,11,66,177,,12,,,*4D
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,64,271,,23,26,201,,28,,,,31,24,091,*48
$GPGSV,4,4,13,32,82,025,*47
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$PSTIS,*61
$GPGSV,4,1,13,04,,,,05,,,,11,66,177,,12,,,*4D
$GPGSV,4,2,13,13,02,206,,14,21,043,,17,33,299,,19,04,175,*73
$GPGSV,4,3,13,20,64,271,,23,26,201,,28,,,,31,24,091,*48
$GPGSV,4,4,13,32,82,025,*47
$GPGGA,,,,,,0,,,,,,,,*66
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,
[/code]

Rutina pro cteni:
[code]
void CheckGPS()
{
HANDLE hFile = ::CreateFile(_T("COM4:"),
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
return;
}

CHAR buffer[BUFFER_SIZE];
ZeroMemory(buffer, BUFFER_SIZE);
BOOL result = false;
DWORD count = 0;

do
{
result = ReadFile(hFile,
buffer,
BUFFER_SIZE - 1,
&count,
NULL);

if (result && count > 0)
{
buffer[count] = '\0';
}

//Prevest na WCHAR, Zpracovat, pokracovat


}while(result && count > 0);


CloseHandle(hFile);


}
[/code]
RStein (2012)|10.12.2008 20:22
A tady je jeste upraveny cyklus s "dirty" prevodem na wchar, mensim bufferem a s ukoncenim cyklu pouze pri chybe. Ted jsem si na HTC Touch Pro overil, ze bez problemu ziskavam z $GPRMC sentence informaci o fixu pozice a bez problemu koexistuju s TomTomem.
[code]

void CheckGPS()
{
HANDLE hFile = ::CreateFile(_T("COM4:"),
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
return;
}

CHAR buffer[BUFFER_SIZE];
WCHAR wbuffer[BUFFER_SIZE];

ZeroMemory(buffer, BUFFER_SIZE);
ZeroMemory(wbuffer, BUFFER_SIZE * sizeof(WCHAR));
BOOL result = FALSE;
DWORD count = 0;

do
{

result = ReadFile(hFile,
buffer,
BUFFER_SIZE - 1,
&count,
NULL);

if (result && count > 0)
{
buffer[count] = '\0';
//Prevest na WCHAR, Zpracovat, pokracovat
MultiByteToWideChar(CP_OEMCP, 0, buffer, count + 1, wbuffer, BUFFER_SIZE);
MessageBox(m_instance, wbuffer, _T(""), MB_OK);

}





}while(result);



CloseHandle(hFile);


}


[/code]
XYzacatecnik (8)|10.12.2008 21:30
Problem odhalen!
Svuj kod jsem mel temer stejny jako ten Vas (aby taky ne, zas tolik cest neni:), az na jednu "malickost" a to cyklus. Nacetl jsem pouze jednou data a ty vypsal v MessageBoxu, nekdy to vyslo a nekdy ne. Prvni co prijde, tak je prazdny retezec a pak dalsi retezce chodi uz s daty (ty jsem uz logicky nemohl videt), jeste se musim zamyslet, proc to tak je. Kazdopadne se omlouvam za reseni dost zbytecneho problem, za to ze jsem Vas mystifikoval a snazil se zmanipulovat, ze problem je mimo muj kod:) Mockrat dekuji za Vas vynalozeny cas.
RStein (2012)|11.12.2008 09:04
Rádo se stalo. :) Skoro jste mě zviklal, že chyba bude v GPS nebo (emulaci) COM portu. U HP me tedy ledacos neprekvapi :), ale GPS multiplexer i API ReadFile jsou nastesti primo od Microsoftu.