Results 1 to 19 of 19

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215

    Virtual COM port - ñèíõðîíèçèðàíå

    Ìú÷à ñå äà ïðî÷åòà ïàìåòòà íà óñá óñòðîéñòâî ïðåç virtual COM port.
    Âñè÷êî å òî÷íî, êàòî èçêëþ÷èìå ôàêòà, ÷å íå ìîãà äà ñå îïðàâÿ ñúñ ñèíõðîíèçèðàíåòî íà ïèñàíå / ÷åòåíå. Ó-âîòî ïðàùà äàííè, ñàìî ñëåä êàòî ñúì ìó ïðàòèë êîìàíäà, âèíàãè çíàì êàêúâ ðàçìåð äàííè äà î÷àêâàì. WaitForSingleObject è ïðîèçâîäíèòå ñà íîâîñò çà ìåíå è ÿâíî íÿêúäå ãðåøà, çàùîòî ñëåäíèÿò êîä íå ðàáîòè, êàêòî òðÿáâà:

    Code:
    OVERLAPPED ov = {0};
    	ov.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    
    	LPBYTE szBuff = ( LPBYTE ) malloc( sizeof( BYTE ) * nBytesToRead );
    	if( szBuff == NULL )
    	{
    		// exception memory allocation
    	}
    
    	DWORD dwBytesRead = NULL;
    
    	BOOL bStat = ReadFile( m_hDevice, szBuff, nBytesToRead, &dwBytesRead, &ov );
    
    	if( !bStat )
    	{
    		DWORD err = GetLastError();
    
    		if( err & ERROR_IO_PENDING )
    		{
    			DWORD res = WaitForSingleObject( ov.hEvent, 2000 );
    
    			switch( res )
    			{
    			case WAIT_TIMEOUT:
    				// handle timeout
    				break;
    			case WAIT_OBJECT_0:
    				// read is complete
    				break;
    			default:
    				// do something
    				break;
    			}
    			
    		}
    		else
    		{
    			// handle unexpected error
    		}
    	}
    
    	return szBuff;
    Òîâà å èçâàäêà îò ôóíêöèÿòà, êÿòî ÷åòå îïðåäåëåí áðîé áàéòîâå.
    Ïðîáëåìúò å ñëåäíèÿ: bStat âèíàãè å TRUE, âúïðåêè ÷å ReadFile íèùî íå å ïðî÷åëà. Ïðîñòî âñè÷êî ñòàâà ïðåêàëåíî áúðçî è ÿâíî óñá ó-âîòî îùå íå å ãîòîâî ñ äàííèòå. ReadFile îïèòâà äà ÷åòå è âìåñòî äà çàïî÷íå àñèíõðîííî ÷åòåíå è äà âúðíå FALSE, âðúùà TRUE è 0 ïðî÷åòåíè áàéòîâå. Àêî òî÷íî ïðåäè ReadFile ñëîæà Sleep( 100 );, äàííèòå ñà âå÷å â áóôåðà è ReadFile çàïî÷âà ÷åòåíå, êàêòî ñå î÷àêâà.
    Ôóíêöèÿòà ÿ âèêàì âåäíàãà ñëåä êàòî å ïðàòåíà óñïåøíî îïðåäåëåíà êîìàíäà äî ó-âîòî ( ïðèìåðíî äà ìè ïðàòè ñåðèåí íîìåð ). Ïèñàíåòî åñòåñòâåíî ñúùî å overlapped è òàì íÿìà ïðîáëåìè. Íå ðàçáèðàì êàê äà íàêàðàì ReadFile äà ÷àêà, äîêàòî íå ñå ïîÿâÿàò îïðåäåëåíèÿ áðîé áàéòîâå.

    Ïðîáâàõ ñúùî è ñúñ SetCommMask è ñ WaitCommEvent äà ÷àêàì çà EV_RXCHAR... îòíîâî áåç ðåçóëòàò - WaitCommEvent âúîáùå íå ñïèðà è âðúùà 0x00 .

    Êàê ñå ÷åòå îò ïóñò ñåðèåí ïîðò, íÿêîé ìîæå ëè äà ïîìîãíå?
    ×åòîõ ñòàòèè, ôîðóìè... íå ìîæàõ äà ãî ïîäêàðàì.

  2. #2
    Registered abUser ike's Avatar
    Join Date: Jul:2004
    Location: sofiÿ
    Posts: 4,965
    sleep(100);
    ReadFile( m_hDevice, szBuff, nBytesToRead, &dwBytesRead, NULL);

    Have no fear ike iz here.
    CPU Cx486DLC@40MHz, RAM 4MB, VGA Trident 512KB, HDD Conner 160MB, Monitor 14" Color

  3. #3
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    È non-overlapped ñúì ãî òåñòâàë - ðàáîòè, íî äîñòà ïî-áàâíî.
    È èñêàì äà ãî íÿìà òîçè sleep. Ñàìî îò íåãî 13 ìèíóòè ÷àêàíå.
    Êîíêðåòíî çàäà÷àòà ìè å äà èçâèêàì 8000 ïúòè WriteFile/ReadFile çà ìèíèìàëíî âðåìå.
    À â ìîìåíòà ñ òîçè Sleep íàïðàâî ñè å íåèçïîëçâàåìî
    Ïúê è íå å ñèãóðíî òàêà - êàêâî ïðàâèìå, àêî óñá óñòðîéñòâîòî ñå çàáàâè 101 ìñ .

  4. #4
    Registered User
    Join Date: Dec:2007
    Location: Sofia
    Posts: 366
    Ïîêàæè öÿëàòà ôóíêöèÿ, ñàìî îò òàçè èçâàäêà íå ìîæå äà ñå ïðåöåíè êàêâî íå å íàðåä. Íàïðèìåð, êàê ñè îòâîðèë óñòðîéñòâîòî çà ÷åòåíå?

    Ïðîâåðè â äîêóìåíòàöèÿòà íà ReadFile() http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx êàêâè ñà èçèñêâàíèÿòà çà overlapped IO.

  5. #5
    Registered abUser ike's Avatar
    Join Date: Jul:2004
    Location: sofiÿ
    Posts: 4,965
    Quote Originally Posted by genn View Post
    Êîíêðåòíî çàäà÷àòà ìè å äà èçâèêàì 8000 ïúòè WriteFile/ReadFile çà ìèíèìàëíî âðåìå.
    while(true){
    WaitCommEvent(non-overlapped) EV_RXCHAR;
    ReadFile( m_hDevice, szBuff, 1, &dwBytesRead, NULL);
    mybuf=mybuf+szBuff;
    ãëåäàø äàëè â mybuf èìà òîâà êîåòî òè òðÿáâà.
    }//while
    Have no fear ike iz here.
    CPU Cx486DLC@40MHz, RAM 4MB, VGA Trident 512KB, HDD Conner 160MB, Monitor 14" Color

  6. #6
    Registered User
    Join Date: Oct:2003
    Location: Ñîôèÿ
    Posts: 4,317
    Êàòî ÷åòà òóê:
    http://msdn.microsoft.com/en-us/libr...71(VS.85).aspx ,
    ïðè îïðåäåëåíà êîìáèíàöèÿ îò òàéìàóòè ÷åòåíåòî ìîæå äà âðúùà äàííè âåäíàãà, êîëêîòî ãè èìà â áóôåðà, âêëþ÷èòåëíî è 0 áàéòà. Äà íå áè äà ñå ñëó÷âà íåùî ïîäîáíî?

  7. #7
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    Quote Originally Posted by bsb View Post
    Êàòî ÷åòà òóê:
    http://msdn.microsoft.com/en-us/libr...71(VS.85).aspx ,
    ïðè îïðåäåëåíà êîìáèíàöèÿ îò òàéìàóòè ÷åòåíåòî ìîæå äà âðúùà äàííè âåäíàãà, êîëêîòî ãè èìà â áóôåðà, âêëþ÷èòåëíî è 0 áàéòà. Äà íå áè äà ñå ñëó÷âà íåùî ïîäîáíî?
    Äà, òàéìèíãèòå íàðî÷íî ñúì ãè íàïðàâèë, òàêà ÷å ReadFile äà âðúùà âåäíàãà, íî ìèñëåõ, ÷å â àñèíõðîíåí ðåæèì âðúùà FALSE è ñëåä òîâà ïðîñòî òðÿáâà äà èç÷àêàì, äîêàòî ov.hEvent íå å ñèãíàëèçèðàí, ÷å ÷åòåíåòî å ïðèêëþ÷åíî.
    Íÿìàì ãî çà ñúæàëåíèå ñîðñ êîäà ïðè ìåí â ìîìåíòà, íî òîâà å ïî÷òè öÿëàòà ôóíêöèÿ, êîÿòî ÷åòå... èìà ìàëêî ïðîìåíëèâè, êîèòî ñå èíèöèàëèçèðàò.
    OVERLAPPED ñòðóêòóðàòà íå å ëîêàëíà ïðîìåíëèâà, à èìàì äâå ñòðóêòóðè... åäíà çà ÷åòåíå è åäíà çà ïèñàíå, êîèòî ñà ÷ëåíîâå íà êëàñà.... ñëîæèõ ãî òóê, çà äà ñå âèäè êàê ãè èíèöèàëèçèðàì, çàùîòî â MSDN ïèøå, ÷å íåâàëèäíà OV ñòðóêòóðà ìîæå äà äîâåäå òî÷íî äî òàêîâà ïîâåäåíèå - âúðùà âåäíàãà TRUE ñ 0 ïðî÷åòåíè áàéòà.

    @Bombera: Íå áÿõ îáúðíàë âíèìàíèå íà òàçè ãðåøêà ... ùå ãî îïðàâÿ, ìàêàð ÷å êàêòî òè êàçà, åäâà ëè èìà íà÷èí ReadFile äà âúðíå ERROR_COLORSPACE_MISMATCH .
    Íî ïî ïðèíöèï ñè ïðàâ, ÷å å èçòî÷íèê çà ïðèÿòíè ãðåøêè ïîäîáíî ñðàâíåíèå

    @ike: Ùå ãî òåñòâàì òîçè âàðèàíò ...

  8. #8
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Äàé öÿëàòà ôóíêöèÿ, ÷å òóê óñëîâèÿòà ñà ìíîãî.
    Îò äîêóìåíòàöèÿòà íà ReadFile:
    When reading from a communications device, the behavior of ReadFile is governed by the current communication time-out as set and retrieved by using the SetCommTimeouts and GetCommTimeouts functions. Unpredictable results can occur if you fail to set the time-out values. For more information about communication time-outs, see COMMTIMEOUTS.
    Îïà, ïðåâàðè'à ìà...!

    Ï.Ñ.
    Íàäÿâàì ñå, ñè íàÿñíî, ÷å òîâà:
    if( err & ERROR_IO_PENDING )
    ñå åâàëþèðà äî true ïðè 2021(ERROR_COLORSPACE_MISMATCH, íÿìà êàê äà ñå ïîëó÷è òóê, äà, íî âñå ïàê) è å ïîòåíöèàëíà ãðåøêà.
    Last edited by Bombera; 20th November 2009 at 23:21.
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  9. #9
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Àç èñêàõ äà âèäÿ êàê îòâàðÿø COM ïîðòà, CreateFile. Íàëè å îòâîðåí ñ FILE_FLAG_OVERLAPPED? Îñâåí òîâà, èñêàõ äà âèäÿ êàê ñå âúðòè öèêúëà, ðèçåòâà ëè ñå èâåíòà, òúé êàòî òîçè å manual-reset, âèíàãè ëè èíèöèàëèçèðàø ïðàâèëíî OVERLAPPED, çà äà ÷åòå îò ïúðâè áàéò, äà îáìèñëèì çà auto-reset event, êîéòî å ïî-áúðç è ò.í, äà çàìåíèì WaitForSingleObject ñ GetOverlappedResult, çàùîòî ïàê å ïî-áúðçà, äà îáìèñëèì ReadFileEx ñ àñèíõðîíåí êîëáåê, âìåñòî ReadFile, çàùîòî ïàê å ïî-áúðç è ò.í.
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  10. #10
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    CreateFile å îòâîðåí ñ FILE_FLAG_OVERLAPPED. WriteFile ñè ïèøå àñèíõðîííî áåç ïðîáëåìè. Event-à ñúùî ãî ðåñåòâàì - çàáðàâèë ñúì äà ãî íàïèøà òóê...
    Åäâà â ïîíåäåëíèê ùå ìîãà äà ïîñòíà êîäà, à äî òîãàâà ùå ïîïðî÷åòà çà ReadFileEx, çàùîòî "ïî-áúðçà" çâó÷è äîáðå

  11. #11
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Äà òå ïðåäóïðåäÿ çà åäèí ïîòåíöèàëåí ïðîáëåì, ìàêàð ÷å OVERLAPPED íå òè å ëîêàëíà. Àêî èçëåçåø îò ôóíêöèÿòà ïðåäè äà å çàâúðøèëà àñèíõðîííàòà îïåðàöèÿ è OVERLAPPED e ëîêàëíà èëè ïî íÿêàêúâ äðóã ïîâîä ÿ îñâîäîáèø òàçè ïàìåò, çàåòà îò OVERLAPPED è èìà ïåíäèíã îïåðàöèÿ, ïðîãðàìàòà ìîæå äà ïî÷íå äà ãúðìè â äúëáèíèòå ñè. Çà äà ãî èçáåãíåø, ñïèðàò/îòêàçâàò ñå àñèíõðîííèòå çàÿâêè íà òåêóùèÿ òðåä ñ CancelIO è òîãàâà ìîæå äà îñâîáîäèø ñòðóêòóðàòà. Òîâà ÌÑ íå ãî îáÿñíÿâàò íèêúäå, íàó÷èõ ãî ïî òðóäíèÿ íà÷èí
    ReadFileEx íå å ïî-áúðçà, àêî ñå ïîëçâà àíàëîãè÷íî. Èìàõ ïðåäâèä ñëó÷àÿ ñ ïîëçâàíå OVERLAPPED_COMPLETION_ROUTINE. Òàçè ïðîöåäóðà ñå èçïúëíÿâà êàòî àñèíõðîííà ïîòðåáèòåëñêà ïðîöåäóðà, â êîíòåêñòà íà òðåäà, êîéòî ÿ å ñêåäæóëíàë. Çà äà ñå èçïúëíè òàêàâà ïðîöåäóðà/ïðîöåäóðè, òðåäà ñå ñëàãà â àëåðòàáúë ñòåéò ñúñ SleepEx èëè WaitXXXXEx è ùå áúäå ñúáóäåí ïðè çàâúðøâàíå íà I/O îïåðàöèÿ. Òúé êàòî â òîçè ñëó÷àé ñå ïîääúðæàò îòäåëíè ñòðóêòóðè çà îáõîæäàíå îò I/O ìåíèäæúðà, òîé ìîæå äèðåêòíî äà ñèãíàëèçèðà òðåäà, áåç äà ãî ïðàâè ïðåç ñêåäæóëúðà, ñ äâå äóìè. Îñâåí òîâà òðåäîâåòå â àëåðòàáúë ñòåéò ñå îáõîæäàò îò íåãî ïðèîðèòåòíî. Îòòàì èäâà ñêîðîñòòà. Êîãàòî òðåäúò å â òàêúâ ðåæèì, òîé âñå åäíî å îòáåëÿçàí êàòî òàêúâ äà ñå ïðîâåðè ïúðâè äàëè äà áúäå ïóñíàò çà ðàáîòà.
    Ñèãóðåí ëè ñè, ÷å ïèñàíåòî è ÷åòåíåòî íå ñè ïðå÷àò íÿêàê ñè? íå çíàì êàêâà å ëîãèêàòà íà ðàáîòà íà ïðèëîæåíèåòî.
    Last edited by Bombera; 21st November 2009 at 13:38.
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  12. #12
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    Àìè ëîãèêàòà å ñëåäíàòà:
    Èìàì êëàñ ComInterface, êîéòî ñå çàíèìàâà ñ îòâàðÿíåòî íà ó-âîòî, ïèñàíåòî, ÷åòåíåòî - Open, ReadData, WriteData...

    Êîäúò ïî-ãîðå å ÷àñò òî÷íî îò ReadData.
    Òîçè êëàñ ComIntervace ñå ïîëçâà â äðóã UsbDevice, êîéòî âå÷å èìïëåìåíòèðà êîíêðåòíî òîâà ó-âî. Òàì èìà ôóíêöèÿ MakeRequest, êîÿòî ïðèåìà LPBYTE ñ 8 áàéòà, êîèòî ñà êîìàíäàòà äî ó-âîòî, è âðúùà LPBYTE ñ îòãîâîðà, êàòî ñàìàòà ôóíêöèÿ ñå ãðèæè çà âàëèäíîñò íà èíôîðìàöèÿòà - ïðîâåðÿâà äúëæèíà, CRC è ò.í.
    Òà â òàçè ôóíêöèÿ âèêàì ïúðâî WriteData, ÷àêàì äà âúðíå ðåçóëòàò, ñëåä òîâà âèêàì ReadData. Ñàìî ÷å â ìîìåíòà òîâà ðàáîòè, ñàìî àêî ìåæäó âèêàíåòî íà WriteData è ReadData èìà Sleep( 100 );
    Àêî ãî íÿìà, ñå ñëó÷âà ãîðíîòî - âðúùà ìè 0 ïðî÷åòåíè áàéòà, êàòî âúîáùå íå âëèçà â IO_PENDING, çàùîòî ReadFile âðúùà TRUE.

  13. #13
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Íàëè òîâà å ñèòóàöèÿòà, êîÿòî èñêàø äà èìàø:
    If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and less than MAXDWORD, one of the following occurs when the ReadFile function is called:

    * If there are any bytes in the input buffer, ReadFile returns immediately with the bytes in the buffer.
    * If there are no bytes in the input buffer, ReadFile waits until a byte arrives and then returns immediately.
    * If no bytes arrive within the time specified by ReadTotalTimeoutConstant, ReadFile times out.
    Îòòóê å.

    Ïðîñòî ÷åòåø è ÷àêàø äà ñå ñúáåðàò íóæíèÿ òè áðîé áàéòîâå, êàòî çàïàçâàø ïðî÷åòåíèòå â ìåæäèíåí áóôåð.

    Íå ìèñëÿ, ÷å ìîæåø äà î÷àêàø äà èìàø âðúùàíå ñàìî ïðè òî÷íî îïðåäåëåí áðîé áàéòîâå, êîèòî ñè çàðú÷àë äà ñå ÷åòàò, ïðè àñèíõðîííî ÷åòåíå. Òîâà íå ñòàâà íà íèòî åäíî àñèíõðîííî óñòðîéñòâî - íèòî ìåéëñëîò, íèòî íà ñòðèéìèíã ïàéï(íà ìåñèäæ ïàéï ñòàâà), íèòî ñîêåò(òóê ñúùî íå ïîìíÿ), íèòî íà ôàéë(òóê îáèêíîâåíî çíàåø äîêúäå ñè ÷åë è êîëêî äà ïðî÷åòåø, òúé êàòî èìàø äîëíèÿ ëèìåñ, êàêòî è ñèñòåìíà èíäèêàöèÿ çà íàëè÷èåòî ìó(EOF) - ãîëåìèíàòà íà ôàéëà(êîéòî ïàê ìîæå äà áúäå íåïîñòîÿíåí)). Äîáðà ïðàêòèêà å äà íå î÷àêâàø äà ïîëó÷èø êîëêîòî ñè çàðú÷àë, òúé êàòî, ñåùàø ñå, òå ìîæå äà íå äîéäàò íèêîãà òîëêîâà, ÷å äà ãè ïîëó÷èø. Çàòîâà å è òîçè ìåõàíèçúì ñ òàéìàóòèòå. Ïîìàãà òè äà ðàçáåðåø êîãà èìà çàáàâÿíå â ïîòîêà åäèí âèä. Íå ñå çàìèñëÿì äúëáîêî, àìà êàêâî ñòàâà, àêî ÷àêàíåòî òàéìàóò-íå ïî íÿêàêâà ïðè÷èíà, à èìàø áàéòîâå â áóôåðà, äà ðå÷åì îò íåäîâúðøåí ïàêåò äàííè(í-òå áàéòà, êîèòî ÷àêàø äà ñå ñúáåðàò). Òå ìîæå îñòàíàò â áóôåðà íåïðî÷åòåíè, è ùå òè áúäàò âúðíàòè â ñëåäâàùî ÷åòåíå è ëîãèêàòà ñå îáúðêâà. Ðàçáèðà ñå, ìîæå äà èìïëåìåíòèðà êîíòðîëåí ìåõàíèçúì, íî å ïîâå÷å èãðà÷êà îò ðåäåíå íà êàêâîòî è äà ñè ïðî÷åë â ìåæäèíåí áóôåð.
    Àç áèõ íàãëàñèë òàéìàóòèòå íà ïîðòà êàêòî ñà ïî-ãîðå, ïîíå òîâà å äåôèíèðàíî ïîâåäåíèå è áèõ ïîëçâàë ìåæäèíåí áóôåð, ïîçâîëÿâàù äà ñå îòõâúðëÿò è äèôåðåíöèðàò íåäîâúðøåíè ïàêåòè(åâåíòóàëíî).

    Çàâúðòè ðèéä-à â öèêúë ïðîñòî, çàåäíî ñ wait-a, äîêàòî äîéäàò òîëêîâà áàéòà, êîëêîòî òè òðÿáâàò è ãî áðåàêâàé íà òàéìàóò. Ïðè òàéìàóò(òîçè, äåòî å 2000) ïàêåòà ìîæå äà ñå ñ÷èòà íåâàëèäåí çà öåëèòå òè, ïîíå òàêàâà å ëîãèêàòà, êàê ùå ãî èíòåðïåðåòèðàø òàéìàóòà å îòäåëåí âúïðîñ.

    Òè êàê òî÷íî ñè íàãëàñèë òàéìàóòèòå íà ïîðòà, ïîìíèø ëè?

    Code:
    OVERLAPPED ov = {0};
    HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    
    LPBYTE szBuff;
    if((szBuff = (LPBYTE) malloc(sizeof(BYTE) * nBytesToRead )) == NULL ){
    	
    }
    
    BOOL bStat;
    DWORD dwBytesRead = 0;
    DWORD dwOffset = 0;
    DWORD dwTotalBytesToRead = nBytesToRead;
    BOOL fBreak = FALSE;
    
    ov.hEvent = hEvent;
    
    //Âàðèàíò 1
    while(TRUE){
    	
    	bStat = ReadFile( m_hDevice, szBuff + uOffset, nBytesToRead, &dwBytesRead, &ov );
    	if(bStat || ((err = GetLastError) == ERROR_IO_PENDING)){
    		DWORD res = WaitForSingleObject( ov.hEvent, 2000);
    		switch(res){
    			case WAIT_TIMEOUT:
    				// handle timeout
    				// preglevda se ov.Internal - STATUS_PENDING moze da e, operacita ne e gotowa. Ako trqbwa da se izlee na wsqka cena - CancelIO
    				break;
    			case WAIT_OBJECT_0:
    				nBytesToRead -= dwBytesRead; // signed - unsigned srawnenie predpolagam!
    				dwOffset += dwBytesRead;
    				if(dwOffset == dwTotalBytesToRead)
    					fBreak = TRUE;
    				else{
    					ResetEvent(ov.hEvent);
    					ZeroMemory(ov, sizeof(OVERLAPPED)); // che po lesno
    					ov.hEvent = hEvent;
    				}
    				break;
    		}
    		if(fBreak)
    			break;
    	}
    	else
    		break;// indicate error here
    
    }
    
    // Âàðèàíò 2
    while(TRUE){
    	
    	bStat = ReadFile( m_hDevice, szBuff + uOffset, nBytesToRead, &dwBytesRead, &ov );
    	if(bStat || ((err = GetLastError) == ERROR_IO_PENDING)){
    		
    		DWORD res = SleepEx(2000, TRUE);// Òóê ñúñ ñúùèÿ óñïåõ ìîæå äà ñå ïîëçâà GetOverlappedResult, íî íå ìîæå äà ñå óêàæå òàéìàóò
    
    		switch(res){
    			case 0:
    				// handle timeout
    				// preglevda se ov.Internal - STATUS_PENDING moze da e, operacita ne e gotowa. Ako trqbwa da se izlee na wsqka cena - CancelIO
    				break;
    			case WAIT_IO_COMPLETION:
    				nBytesToRead -= dwBytesRead; // signed - unsigned srawnenie predpolagam!
    				dwOffset += dwBytesRead;
    				if(dwOffset == dwTotalBytesToRead)
    					fBreak = TRUE;
    				else{
    					ResetEvent(ov.hEvent);
    					ZeroMemory(ov, sizeof(OVERLAPPED)); // che po lesno
    					ov.hEvent = hEvent;
    				}
    				break;
    		}
    		if(fBreak)
    			break;
    	}
    	else
    		break;// indicate error here
    
    }
    
    CloseHandle(hEvent);
    
    if(dwOffset == 0){
         free(szBuff);
         return NULL;
    }
    return szBuff;
    Àêî çàìåíèø èâåíòà ñ autî-reset, ùå ñè ñïåñòèø ãàëèìàöèèòå ïî ðèçåòâàíåòî ìó è ùå å ïî-áúðçî. Manual-reset â ñëó÷àÿ íÿìà ñìèñúë, ïîíåæå ÷àêàø ñàìî ñ åäèí òðåä íà íåãî.
    Last edited by Bombera; 22nd November 2009 at 12:39.
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  14. #14
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    Quote Originally Posted by Bombera View Post
    ...
    Ñòðàõîòíî, áëàãîäàðÿ.
    Â ïîíåäåëíèê ùå òåñòâàì è ùå äîêëàäâàì êàêâî å ñòàíàëî .
    Òàéìèíãèòå â ìîìåíòà ñà: ReadTotalTimeoutMultiplier = MAXWORD, âñè÷êî äðóãî å íóëà.
    Ïðàâ ñå çà öèòàòà - òî÷íî òîâà ìè òðÿáâà.

  15. #15
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Çíà÷è ñàìî ñëîæè ReadTotalTimeoutConstant äà å ïî-ãîëÿìî îò íóëà è ïî-ìàëêî îò MAXDWORD, çà äà ñå ïîëó÷è öèòèðàíîòî ïîâåäåíèå.

    Ñëîæèõ äðåáíè êîðåêöèè, êîçìåòè÷íè, â êîäà.

    Íåùî íå î÷àêâàì äà òðúãíå îäìà, ìà äàíî ñà ñàìî ëîøè ïðåä÷óâñòâèÿ
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  16. #16
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    Àç ñúì òàêà èëè èíà÷å íà ïðèíöèïà "Àêî òðúãíå îò ïúðâèÿ ïúò, çíà÷è èìà íÿêàêúâ ïðîáëåì"

  17. #17
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    @Bombera: Íàïðàâèõ ãî ïî âàðèàíò 1, íî íå âúðâè ïðè ïî-äúëãèòå ïàêåòè.
    Àêî èçïðàòÿ êîìàíäà, êîÿòî èçèñêâà êðàòúê îòãîâîð ( 8 èëè 12 áàéòà ), âñè÷êî å òî÷íî.
    Íî çàïî÷íà ëè ñúùèíñêîòî ñâàëÿíå íà èíôîðìàöèÿ, óñòðîéñòâîòî ïðàùà ïàêåòè îáùî ïî 1058 áàéòà. Çàïî÷âà äà ÷åòå è ïî íÿêîå âðåìå ReadFile ãúðìè ñ ãðåøêà
    Code:
    ERROR_NOACCESS 998 (0x3E6) Invalid access to memory location.
    Âúïðåêè âñè÷êî óñïÿõ äà ãî ïîäêàðàì ïî äðóã íà÷èí - ïðåäè èçîáùî äà âèêàì ReadFile, ÷àêàì íóæíèòå áàéòîâå äà ñå ñúáåðàò â áóôåðà ïî ïîäîáåí íà÷èí:

    Code:
    COMSTAT ComStat = {0};
    
    	ClearCommError( m_hDev, &dwErrorFlags, &ComStat );
    
    	// Wait for the data to arrive
    	while( ComStat.cbInQue < dwBytesToRead )//( DWORD ) nLimit
    	{
    		ClearCommError( m_hDev, &dwErrorFlags, &ComStat );
    		//cout << ComStat.cbInQue << endl;
    		Sleep( 1 );
    	}
    Ñëàãàì ãî, êàêòî êàçàõ ïðåäè äà âèêíà âåäíúæ ReadFile. Íóæäà îò while( TRUE ) íÿìà.
    Ðàáîòè äîñòà äîáðå, äîñåãà íå ñúì çàáåëÿçàë íÿêàêâè ïðîáëåìè ... ÷å äàæå è îò ñêîðîñòòà ñúì äîâîëåí - êàòî ìàõíàõ Sleep( 100 ); òðúãíà äîñòà ïî-áúðçî .

    Äàëè å äîáðî è ñèãóðíî ðåøåíèå - íÿìàì èäåÿ... âèäÿõ â åäèí ôîðóì ïðåäëîæåíèå çà ïîäîáåí êàòî ìîÿ ïðîáëåì è òî âçå ÷å ñòàíà.

    Íî åäíî íåùî íàó÷èõ ñúñ ñèãóðíîñò - ñåðèåí ïîðò äà ñèíõðîíèçèðàø ñè å åâ@ëî ì@éê@ò@

  18. #18
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Êàçâàø, àêî çàäàäåø 1058 áàéòà çà ÷åòåíå, ñ òîëêîâà ãîëÿì è çàäåëåí áóôåð, ãúðìè? À ñëåä êîëêî áàéòà ïðî÷åòåíè ãúðìè? Òîâà å ïðîáëåì íà íàøèÿ áóôåð, íå íà ReadFile. Ìîæå áè èñêà àëàéíìúíò íà áëîêà ïàìåò çà áóôåðà íà 4 áàéòà, òîãàâà âìåñòî malloc, òðÿáâà äà å ñ VirtualAlloc, èëè ïî-ïðîñòî, ãîëåìèíàòà íà áóôåðà äà å êðàòíà íà 8, íàé-áëèçêà, íî ïî-ãîëÿìà èëè ðàâíà íà æåëàíèÿ ðàçìåð. Íàìèðàø ñëåäâàùèÿ êðàòåí íà 4 àäðåñ îò ïîëó÷åíèÿ ïðè çàäåëÿíåòî è òîé ñòàâà íà÷àëî íà áóôåðà, à íàêðàÿ èìàø 4 ðåçåðâíè áàéòà, êîèòî ùå ñà êàòî ïðîäúëæåíèå, ñëåä èçìåñòâàíåòî äî êðàòåí íà 4 àäðåñ íà íà÷àëîòî.
    Ùå ìè å èíòåðåñíî äà ðàçáåðà çàùî íå ðàáîòè è äàëè ñëåä ïðîìÿíàòà íà òàéìàóòèòå, ïúðâèÿò òè êîä íå áè çàðàáîòèë.
    Íî ñå ðàäâàì, ÷å ñè íàìåðèë íà÷èí äà ñå îïðàâèø.
    EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
    Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî

  19. #19
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    È àç ïîìèñëèõ, ÷å ïðîáëåìúò å ïðè szBuff è ïðîâåðèõ êîëêî áàéòà ìó ñå îòäåëÿò - 1058.
    Ãúðìåøå íÿêúäå êúì 250-èÿ áàéò.
    Êàêòî è äà å, ÷åñòíî êàçàíî íÿìàì æåëàíèå ïîâåå äà ãî ðú÷êàì - ùå ãî òåñòâàì óñèëåíî òåçè äíè è ñå íàäÿâàì äà íÿìà ïðîáëåìè, çà äà ñå çàõâàùàì ñ äðóãè ðàáîòè .


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Copyright © 1999-2011 Õàðäóåð ÁÃ. Âúçìîæíî å ñúäúðæàíèåòî íà òàçè ñòðàíèöà äà å îáåêò íà àâòîðñêè ïðàâà.
iskamPC.com | mobility.BG | Bloody's Techblog | Êðèïòîâàëóòè è ìàéíèíã | 3D Vision Blog | Ìàãàçèí çà åëåêòðîííè öèãàðè