Jeg er igang med at lære at bruge seriel porten. Jeg har lavet et loopback-kabel, således at jeg kører hyperterminal på COM2, og mit test program på com1.
Mit program sender også fint nok, når strengene ikke er så lange, men den streng jeg bruger nu fylder 16 bytes, og bliver kun sendt til og med 'e'. Under min fejlsøgning, fandt jeg ud af at writefile og GetOverlappedResult returnere false. Når jeg kalder GetLastError, får jeg bare false.
Her er min rutine.... //----------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { DCB dcb; COMMTIMEOUTS TimeOuts; COMMPROP CommProperties; HANDLE hComport; unsigned long Written; OVERLAPPED OverLapped; unsigned char Buffer[]={'1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f',0};
hComport = INVALID_HANDLE_VALUE; hComport = CreateFile( "COM1", GENERIC_READ+GENERIC_WRITE, 0, // must be opened with exclusive-access 0, //no security OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if (hComport==INVALID_HANDLE_VALUE){ Button1->Caption="handle error"; }
Har du testet indholdet af Written efter kaldet til WriteFile? Har du prøvet at gøre det uden FILE_FLAG_OVERLAPPED?
Jeg har ikke prøvet at bruge FILE_FLAG_OVERLAPPED men i min dokumentation (MSDN) står der:
"If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the write operation starts at the offset specified in the OVERLAPPED structure and WriteFile may return before the write operation has been completed. In this case, WriteFile returns FALSE and the GetLastError function returns ERROR_IO_PENDING. This allows the calling process to continue processing while the write operation is being completed. The event specified in the OVERLAPPED structure is set to the signaled state upon completion of the write operation."
Det betyder så vidt jeg kan læse at du skal kalde WriteFile igen for at få sendt resten, hvis den ikke sender det hele første gang.
Efter første kald er hele sende FIFO'en i seriel chippen (UART, sikkert en 16550 med 16 byte FIFO) nok fuld, det der defineres i OVERLAPPED er nok en callback der activeres når seriel chippen er færdig med at sende de førte 16 byte. Kalder du igen omgående fil du sikkert kun få skrevet en eller nul byte extra da UART'en ikke har nået at få sendt så meget, ved 9600 baud tager det ca. 1ms at få sendt en byte.
Her kommer mine C kundskaber til kort, hvordan laver man løkke, som tester osv. Jeg har prøvet en while løkke, men det låser programmet, men til gengæld for jeg fyldt hele min hyperterminal med hele strengen også de før manglende bytes.
Når Handlen lukkes, inden alt er sendt går dataen tabt. Jeg har løst det ved at lave en while(!GetOverLappedResult). Når GetOverLappedResult returner en høj, er det fordi hele strengen er sendt. Så slutningen af koden kom til at se ud som flg... ---------------------------------------- Edit1->Text=WriteFile( hComport, &Buffer, (unsigned long) sizeof(Buffer), &Written, &OverLapped);
Der er så vidt jeg kan ikke se nogen grund til at bruge overlapped skrivning, når du alligevel blot venter på at den er færdig med en while loop. Er pointen med overlapped ikke at man kan lave andet mens man venter på at den skriver?
tje >> I fht. brugen af overlapped kommunikation, er det netop også sådan som du gør, det også anbefales at man skal gøre. På http://msdn.microsoft.com/library/en-us/dnwbgen/html/msdn_serial.asp?frame=true findes en længere, og god artikel om hvordan man laver seriel kommunikation, og særligt forskellen mellem Overlapped og non-overlapped kommunikation.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.