nadawanie + odbior rs problem

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

Reply to
Robert
Loading thread data ...

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

Reply to
Greg(G.Kasprowicz

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

Reply to
Robert

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.