Jak poprawnie realizować jednoczesne nadawanie i odbieranie RS w MFC?

nadawanie + odbior rs problem





Poprzedni Następny
Wiadomość
Spis treści
From: Robert <raydenx_at_nospam_o2.pl>
Subject: nadawanie + odbior rs problem
Date: Wed, 23 Nov 2005 09:34:31 +0100


Natknalem sie na problem podczas transmisji szeregowej
Generalnie wszystko bylob ok ... ale ...
Program ma dwa watki w pierwszym obsluguje okno dialogowe
oraz nadawanie, w drugim jest realizowany odbior w ciaglej petli
Wysylanie po bajcie dziala ok, odbierac tez odbiera dobrze
problem w tym ze jak probuje rownoczesnie nadawac i obierac to
pojawia sie blad programu. Zaznacam ze w obu watkach korzystam z
tego samego uchwytu do urzadzenia.
Czy w ogole takie rownoczesne nadawanie i odbior jest dozwolone??
Czy mozna by temu zaradzic stosujac np. sekcje krytyczne??
Jak bezpiecznie moge zasygnalizowac z watka ktory odbiera dane ze
np odebrano oczekiwany ciag? poki co robie to za pomoca flag
kiedys probowalem uzywac PostMessage ale mi sie program po kilku
wywolaniach wywalal.
Co wiecej program jest typu MFC application, dialog based pod .net
watek tworze za pomoca afx_BeginThread.

Za wszelkie sugestie z gory dziekuje.
Pozdrawiam.

Robert

Poprzedni Następny
Wiadomość
Spis treści
From: "Greg\(G.Kasprowicz\)" <gkasprow_at_nospam_gmail.com>
Subject: Re: nadawanie + odbior rs problem
Date: Wed, 23 Nov 2005 16:41:17 +0100


Czy w ogole takie rownoczesne nadawanie i odbior jest dozwolone??
jak najbardziej, czesc nadawcza i odbiorcza sa niezalezne, pislaem prosta
aplikacje uzywajac MFC do RS232 i dziala bez problemu




Poprzedni Następny
Wiadomość
Spis treści
From: Robert <raydenx_at_nospam_o2.pl>
Subject: Re: nadawanie + odbior rs problem
Date: Fri, 25 Nov 2005 21:27:55 +0100


Greg(G.Kasprowicz) wrote:
Czy w ogole takie rownoczesne nadawanie i odbior jest dozwolone??

jak najbardziej, czesc nadawcza i odbiorcza sa niezalezne, pislaem prosta
aplikacje uzywajac MFC do RS232 i dziala bez problemu



Szczrze powiedziawszy zrobilem sobie synchronizacje nadawania i odbioru
i to zalatwilo mi problem. Dodalem tez timeouty aby funkcja ReadFile nie
czekala mi w nieskonczonosc na odebranie znakow.

Aczkolwiek ciekawa jest mogliwosc wykonywani atych operacji roznoczesnie
Moj program wygladal +/- tak


UINT f_watka(...)
{
while(isActive)
{
Readfile(....)
....
porownie co przyszlo + wpis do tabl
....
}
}


Zas wysylanie bylo realizowane po nascisniencu przycisku

void MyDlg::OnButtWyslij()
{
....
WriteFile(....)
}


no i program jak chodzil watek to podczas wyslania sie zwieszal

Port inicjowalem w sposob nastepujacy:

portCOM = CreateFile(port_id, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, NULL, NULL);


if(portCOM!=INVALID_HANDLE_VALUE)
{
isOpen = true;
konf_dcb.DCBlength = sizeof(konf_dcb);
GetCommState(portCOM,&konf_dcb);
konf_dcb.BaudRate = speed;
konf_dcb.fParity = 0;//TRUE;
konf_dcb.Parity = NOPARITY;
konf_dcb.StopBits = ONESTOPBIT;
konf_dcb.ByteSize = 8;
konf_dcb.fOutxCtsFlow = 0;
konf_dcb.fOutxDsrFlow = 0;
konf_dcb.fDtrControl = DTR_CONTROL_DISABLE;
konf_dcb.fDsrSensitivity = 0;
konf_dcb.fRtsControl = RTS_CONTROL_DISABLE;
konf_dcb.fOutX = 0;
konf_dcb.fInX = 0;

* ustawienie maski *

SetCommMask(portCOM, 0);

SetCommTimeouts(portCOM,&cto);
* Wlasciwa konfiguracja portu *

fSuccess = SetCommState(portCOM, &konf_dcb);
//maska_zdarz = (EV_TXEMPTY | EV_RXCHAR);
//SetCommMask(portCOM,maska_zdarz);

if(fSuccess)
{
MessageBox("Port OK!","Informacja",MB_OK);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); //Uaktywnij przycisk
Pobierz probke
CComboBox *m_PortCombo;
m_PortCombo = (CComboBox *) GetDlgItem(IDC_COMBO1);
m_PortCombo->EnableWindow(FALSE); //Wylacz mozliwoasc zmiany port

}
else
{
MessageBox("Blad inicjacji DCB","Blad!",MB_OK | MB_ICONERROR);
}

}
else
{
blad_coma = GetLastError();
MessageBox("Blad otwarcia","Blad!",MB_OK | MB_ICONERROR);
}
}