Jak poprawnie realizować jednoczesne nadawanie i odbieranie RS w MFC?
nadawanie + odbior rs problem
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
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
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);
}
}