Wikipedia:
dupleks (ang. full duplex) - informacje przesyłane są w obu kierunkach
jednocześnie, bez spadku transferu;
W jaki sposób najlepiej przeprowadzić transmisję jako
pełny duplex w sposób programowy poprzez RS232C.
Problem :
1.Otwieramy port - otrzymujemy uchwyt do COM -> hCom.
2.Tworzymy dwa wątki jeden czyta z COM drugi pozwala
na zapis.
Niestety - urządzenie posiada dwa bufory ale jest
dostępne poprzez jeden uchwyt (nie pomoże tu rozdzielenie
na dwie zmienne ).
Zawieszając legalnie jeden wątek w oczekiwaniu np. na odebranie
znaku [ WaitCommEvent ] następuje zablokowanie drugiego.
czyli dupa-plex....
Pseudo kod:
HANDLE hCom = CreateFile("COM1",.....
Watek_1_czyta(hCom)
{
while(..)
{
ReadFile(hCom,buf...);
WaitCommEvent(hCom,EV_ODEBRANO...// <-- to zablokuje
// oba wątki!
}
}
//--------------------------------------------------
Watek_2_pisze(hCom)
{
while(..)
{
WriteFile(hCom,buf...);
}
}
//--------------------------------------------------
Które rozwiązanie zastosować?
a) Można usunąć funkcje typu Wait.. ,cyklicznie sprawdzać zawartość buforów
i pozwolić na to aby system przydzielał dostęp do hCom i czas wątkom.
( nie wiem czy to jest do końca bezpieczne)
b) Zastosować sekcje krytyczną na hCom - czyli na "przemian" jeśli aplikacja
zacznie czytać jednym wątkiem odda czas drugiemu dopiero po
zakończeniu czytania i zwolnieniu dostępu do hCom .
Wydaje się że to może sprawić że wymiana danych będzie mniej "płynna" .
c) inny sposób [?]
Tak czy inaczej ten "pełny" duplex wydaje się bardziej teoretyczny niż
możliwy do zrealizowania bo przecież wątki i tak są szeregowane .
Czy warto coś tutaj kombinować jeśli aplikacja ma działać jako terminal
tak że nie wymaga super prędkości w wymianie danych ?
Jeśli ktoś ma jakieś uwagi to proszę o wypowiedz ....