VC++/Communication port problem
9 отговора
215 прегледа
VC++/Communication port problem
int CSerial::ReadData( void *buffer, int limit )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead,&m_OverlappedRead );
if( !bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}
return( (int) dwBytesRead );
}
Nemoga da razbera tva ot tupiq windows li e ama zashto ponqkoga prosto neshte da pro4ete nishto... vrushta 0, a na com porta postoqnno se podavat danni. Tva ne mi e qsno
Posleslov: Tva mi e za 4etene ot com porta, ama nemoga da razbera sto 4ete kogato mu skimne.
Nqkoj ima li nqkva ideq kak moge da se opravi tova?//
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead,&m_OverlappedRead );
if( !bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}
return( (int) dwBytesRead );
}
Nemoga da razbera tva ot tupiq windows li e ama zashto ponqkoga prosto neshte da pro4ete nishto... vrushta 0, a na com porta postoqnno se podavat danni. Tva ne mi e qsno
Posleslov: Tva mi e za 4etene ot com porta, ama nemoga da razbera sto 4ete kogato mu skimne.
Nqkoj ima li nqkva ideq kak moge da se opravi tova?//
Re: VC++/Communication port problem
Ami vij, problemi moje da ima mnogo, a ti si dal tvurde malko informacia.
1) Vajno e dali suvpadat nastroikite na COM porta na komputera i na ustroistvoto, koeto vruzvash kum nego, no ti za tova sigurno si se pogrijil.
2) Ne si pokazal kak otvaryash porta. Moje da ima problemi s nastroikite na DCB strukturata. Tya e mnogo kaprizna i tryabva da se poeksperimentira.
I nai-vajnoto:
3) Po princip tozi kod (predpolagam, che si go kopnal otnyakude), e napisan taka, che v opredeleni situacii da vrushta 0. Vsushtnost, ako go vikash nonstop v nyakakuv cikul, normalno e pri povecheto izvikvaniya da vrushta 0, zashtoto dannite pristigat s mnogo po-malka skorost, otkolkoto gi chete programata. Taka, che tova ne moje da e kriterii za tova dali si poluchil vsichki danni. Vij, ako se gubyat danni, tova veche opredeleno e problem.
Taka che: ako ne si probval dali koda se durji po sushtiya nachin na drug komputur i/ili pod druga versiya na Windows, napravi go. Ako problemite produljavat, znachi neshto ne pravish kakto tryabva. Ako tova e sluchayat, poigrai si s nastroikite na po-neyasnite poleta ot DCB-to, kato naprimer razmerut na opashkite i t.n.
I da, osven tova, ako imash vuzmojnost, probvai s razlichni skorosti, probvai da poluchavash dannite s HyperTerminal ili druga podobna programa i ako raboti, da debug-nesh tvoyata programa za da vidish kakvi sa nastroikite na DCB-to sled rabotata na drugata programa (t.e. da vidish kakvo poluchavash sled GetDCB /ne sum siguren taka li se kazvashe funkciyata/) i ne zabravyai, che pri skorosti nad 11500 Windows prosto ne smogva da prochete dannite i te se gubyat.
Tova e, nadyavam se da sum ti bil polezen. Bih ti dal i po-konkretna informaciya, no mina izveshtno vreme, otkakto se zanimavah s tova, a ne mi se rovi ;))
1) Vajno e dali suvpadat nastroikite na COM porta na komputera i na ustroistvoto, koeto vruzvash kum nego, no ti za tova sigurno si se pogrijil.
2) Ne si pokazal kak otvaryash porta. Moje da ima problemi s nastroikite na DCB strukturata. Tya e mnogo kaprizna i tryabva da se poeksperimentira.
I nai-vajnoto:
3) Po princip tozi kod (predpolagam, che si go kopnal otnyakude), e napisan taka, che v opredeleni situacii da vrushta 0. Vsushtnost, ako go vikash nonstop v nyakakuv cikul, normalno e pri povecheto izvikvaniya da vrushta 0, zashtoto dannite pristigat s mnogo po-malka skorost, otkolkoto gi chete programata. Taka, che tova ne moje da e kriterii za tova dali si poluchil vsichki danni. Vij, ako se gubyat danni, tova veche opredeleno e problem.
Taka che: ako ne si probval dali koda se durji po sushtiya nachin na drug komputur i/ili pod druga versiya na Windows, napravi go. Ako problemite produljavat, znachi neshto ne pravish kakto tryabva. Ako tova e sluchayat, poigrai si s nastroikite na po-neyasnite poleta ot DCB-to, kato naprimer razmerut na opashkite i t.n.
I da, osven tova, ako imash vuzmojnost, probvai s razlichni skorosti, probvai da poluchavash dannite s HyperTerminal ili druga podobna programa i ako raboti, da debug-nesh tvoyata programa za da vidish kakvi sa nastroikite na DCB-to sled rabotata na drugata programa (t.e. da vidish kakvo poluchavash sled GetDCB /ne sum siguren taka li se kazvashe funkciyata/) i ne zabravyai, che pri skorosti nad 11500 Windows prosto ne smogva da prochete dannite i te se gubyat.
Tova e, nadyavam se da sum ti bil polezen. Bih ti dal i po-konkretna informaciya, no mina izveshtno vreme, otkakto se zanimavah s tova, a ne mi se rovi ;))
Re: VC++/Communication port problem
Stava li da si dadesh emaila da ti pratq sourceto da go vidish. To e edin class.?
Re: VC++/Communication port problem
Moga samo da dopalnia che e vazno da si vidis i protokolite , tiahnata poddrazka ot saotvetnoto ustrojstvo, kakto i kabela za vrazka s ustrojstvoto.
No ako HT poluchava vsichki danni a tvoiata programa ne - imas problem :)).
Opitaj da slozis cheteneto v thread (ako ne si go napravil)
Az lichno predpochitam da mina bez Overlaped - ama e vapros na izbor, ako e bez Overlaped i pri lipsa na danni ot com porta triabva da se dobavi edin Sleep(1); za da ne se iade tvarde mnogo procesorno vreme.
No ako HT poluchava vsichki danni a tvoiata programa ne - imas problem :)).
Opitaj da slozis cheteneto v thread (ako ne si go napravil)
Az lichno predpochitam da mina bez Overlaped - ama e vapros na izbor, ako e bez Overlaped i pri lipsa na danni ot com porta triabva da se dobavi edin Sleep(1); za da ne se iade tvarde mnogo procesorno vreme.
Re: VC++/Communication port problem
Вместо sleep използвай SetCommTimeouts в началото.
ReadFile ще блокира за определения таймаут, ако няма данни.
MSDN for more info ..
ReadFile ще блокира за определения таймаут, ако няма данни.
MSDN for more info ..
Re: VC++/Communication port problem
E dobre de ama ako
COMSTAT CS;
ClearCommError(hCom,&ModS,&CS);
CS.cbInQue mi e nula za kakvo tochno da vikam ReadFile?
Prosto vapros na predpochitania spored men
COMSTAT CS;
ClearCommError(hCom,&ModS,&CS);
CS.cbInQue mi e nula za kakvo tochno da vikam ReadFile?
Prosto vapros na predpochitania spored men
Re: VC++/Communication port problem
[email protected]
Shte go pogledna, no ako mojesh prati i sourca, koito go izpolzva, za da vidya kakvo tochno stava. I osven tova pishi po-podrobno za komunikaciyata s ustroistvoto i kakvi fizicheski linii ima. Vse pak ne razbrah: ti li si pisal class-a ili si go chopnal ot nyakude?
Shte go pogledna, no ako mojesh prati i sourca, koito go izpolzva, za da vidya kakvo tochno stava. I osven tova pishi po-podrobno za komunikaciyata s ustroistvoto i kakvi fizicheski linii ima. Vse pak ne razbrah: ti li si pisal class-a ili si go chopnal ot nyakude?
Re: VC++/Communication port problem
znachi ako e pod 98 i dannite w com porta prehwyrlqt opredelen broi nezawisimo kakwi buferi si dal (pri men zapochwaha da se gubqt kato minat okolo 4k, ne mojeh tochno da go zaseka de), zapochwat da se gubqt
az imah syshtiq problem s 98 i nt - pod nt raboti perfect, pod 98 se gubi nqkyde wryzkata
reshenieto mi beshe w edin thread prez cqloto wreme da cheta kakwoto ima i da si go butam w sobstwen po-golqm bufer...
dano ti pomogne...az mnogo qdowe brah s towa
-------------------------------
Koito go moje - go moje!
az imah syshtiq problem s 98 i nt - pod nt raboti perfect, pod 98 se gubi nqkyde wryzkata
reshenieto mi beshe w edin thread prez cqloto wreme da cheta kakwoto ima i da si go butam w sobstwen po-golqm bufer...
dano ti pomogne...az mnogo qdowe brah s towa
-------------------------------
Koito go moje - go moje!
Re: VC++/Communication port problem
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts( m_hIDComDev, &CommTimeOuts );
Eto tova mi e za timeouts
ama neznam ako iskam da priemam okolo 5 bytes, na kolko trqbva da sa mi tiq ReadIntervalTimeout = 0xFFFFFFFF; ReadTotalTimeoutMultiplier = 0;ReadTotalTimeoutConstant = 0;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts( m_hIDComDev, &CommTimeOuts );
Eto tova mi e za timeouts
ama neznam ako iskam da priemam okolo 5 bytes, na kolko trqbva da sa mi tiq ReadIntervalTimeout = 0xFFFFFFFF; ReadTotalTimeoutMultiplier = 0;ReadTotalTimeoutConstant = 0;
Re: VC++/Communication port problem
towa oznachawa che wyobshte ne chaka a se wryshta wednaga s kolkoto ima procheteni bytes
5000ms(5sec) e mnogo golqmo chislo za pisane na 1 byte w porta ako rabotish na skorost poweche ot 0.2 bytes w secunda ili 1 bit/s....
normalno chislo e okolo 10 za 9600 i ne poweche ot 2 za 115200
a za WriteTotalTimeoutMultiplier ne e dobre da e 0 - po-dobre 1 ili 2
tezi 2 neshta ako si prochel dokumentaciqta dobre oznachawat
ako napishesh
WriteFile (hCom, buf, num_bytes_to_write, &written, hEvent);
to obshtoto wreme koeto se izchakwa (ako se izpratqt po-rano ti se wryshta uprawlenieto) e
num bytes * WriteTotalTimeoutMultiplier * WriteTotalTimeoutConstant
pri read e syshtoto kato intervaltimeout e maximum koito iskash da chakash wypreki che num*constant*multiplyer moje da e poweche
Zatowa ako ti trqbwat tochno po 5 bytes probwai da si nastroish timeoutite taka
100
10
10
2
10
ili 100ms max za chetene (ako gi ima procheteni w bufera na drivera se wryshta wednaga) i po 20ms max (rqdko e poweche ot 5) za pisane na wseki byte w porta
-------------------------------
Koito go moje - go moje!
5000ms(5sec) e mnogo golqmo chislo za pisane na 1 byte w porta ako rabotish na skorost poweche ot 0.2 bytes w secunda ili 1 bit/s....
normalno chislo e okolo 10 za 9600 i ne poweche ot 2 za 115200
a za WriteTotalTimeoutMultiplier ne e dobre da e 0 - po-dobre 1 ili 2
tezi 2 neshta ako si prochel dokumentaciqta dobre oznachawat
ako napishesh
WriteFile (hCom, buf, num_bytes_to_write, &written, hEvent);
to obshtoto wreme koeto se izchakwa (ako se izpratqt po-rano ti se wryshta uprawlenieto) e
num bytes * WriteTotalTimeoutMultiplier * WriteTotalTimeoutConstant
pri read e syshtoto kato intervaltimeout e maximum koito iskash da chakash wypreki che num*constant*multiplyer moje da e poweche
Zatowa ako ti trqbwat tochno po 5 bytes probwai da si nastroish timeoutite taka
100
10
10
2
10
ili 100ms max za chetene (ako gi ima procheteni w bufera na drivera se wryshta wednaga) i po 20ms max (rqdko e poweche ot 5) za pisane na wseki byte w porta
-------------------------------
Koito go moje - go moje!