VC++/Communication port problem

9 отговора 215 прегледа
#1

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?//

Отговор
в отговор на mtx_bg #2

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 ;))

Отговор
в отговор на MishoM #3

Re: VC++/Communication port problem

Stava li da si dadesh emaila da ti pratq sourceto da go vidish. To e edin class.?

Отговор
в отговор на mtx_bg #4

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.

Отговор
в отговор на bira_more #5

Re: VC++/Communication port problem

Вместо sleep използвай SetCommTimeouts в началото.
ReadFile ще блокира за определения таймаут, ако няма данни.
MSDN for more info ..

Отговор
в отговор на тpaлaлa #6

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

Отговор
в отговор на mtx_vt #7

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?

Отговор
в отговор на mtx_bg #8

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!
Отговор
в отговор на bira_more #9

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;

Отговор
в отговор на mtx_bg #10

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!
Отговор