| 
			| 
					
						| vegor 
								Интересующийся    Offline | 
								|  | «  : 05-03-2010 13:01 »  |  | 
 
 Здравствуйте всем, я в форумах в первы е, и просил бы не судить очень строго. П омогите,  пожалуйста, хочу реализовать приложение,  работающее  с <COM> портом. А для проверки работы приложения коротко замыкаю(к.з.) ножки RD(Вх.) и TD(Вых.), чтобы WriteFile дала данные,  а ReadFile считало бы те же данные с того же порта.С начала  создаю диа логовое приложение <bbb>,  а потом,  например в OnInitDialog()-е,  создаю COM-порт  {...
 
 OVERLAPPED ovr;
 
 hCOM = CreateFileA("COM1", GENERIC_READ |GENERIC_WRITE, // создание синхронного порта
 0,NULL,OPEN_EXISTING,NULL,NULL);
 PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
 GetCommState(hCOM,&dcb);
 SetCommState(hCOM,&dcb);
 SetCommTimeouts(hCOM,&to);
 
 SetupComm(hCOM,in,out);
 
 //memset(&ovr,0,sizeof(ovr));
 //ovr.hEvent =::CreateEventA(NULL,FALSE,FALSE,NULL);
 
 PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
 
 int in = 0;
 int out = 0;
 
 return TRUE;  // return TRUE  unless you set the focus to a control
 }
потом создаю кнопку и в нем создаю поток CbbbDlg* lpMyObject = new CbbbDlg;AfxBeginThread(MyFunction, lpMyObject,0,0,0,0);
 
а в MyFunction-е UINT MyFunction(LPVOID pParam);UINT MyFunction(LPVOID pParam)
 {
 CbbbDlg* lpObject = (CbbbDlg*)pParam;
 // CSingleLock FirstLock(&(lpObject->m_Critic)) ; /// что то для синхронизации
 
 lpObject->OnBnClickedButtonWrite();  // в нем WriteFile
 
 return 0;
 
 }
а в  void CbbbDlg::OnBnClickedButtonWrite(){
 out = 20;  /// например out = 20
 while(1)
 WriteFile(hCOM,(LPCVOID)&out,sizeof(out),&dw,&ovr);
 
 }
и создаю кнопку для чтения из порта void CbbbDlg::OnBnClickedButtonReadCom()   ///кнопка{
 
 ReadFile(hCOM , (LPVOID)&in , sizeof(in) , &dw , &ovr);
 m_edit_int = in;  /// m_edit_int это <edit control> где должен отображатся <in>
 UpdateData(FALSE);
 }
а в конце Ниvoid CbbbDlg::OnBnClickedButtonCancel()  /// Cancel{
 PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
 CloseHandle(hCOM);
 
 OnOK();
 }
какой ошибки не дает,  а после запуска приложения,  когда нажимаю кнопку OnBnClickedButtonReadCom() в <edit control>-е ничего не изменяется, результат <0> |  
						| 
								|  |  
								| « Последнее редактирование: 16-03-2010 08:53 от Sel » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 05-03-2010 15:21 »  |  | 
 
 vegor, для начала - читаем теорию https://club.shelek.ru/viewart.php?id=208 (ищи там строку "РАБОТА С КОММУНИКАЦИОННЫМ ПОРТОМ COM В ПРОГРАММАХ ДЛЯ WIN32") |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| vegor 
								Интересующийся    Offline | 
								|  | « Ответ #2 : 15-03-2010 08:34 »  |  | 
 
 Большое спосибо, Алексей1153++,  за хорошую статью , но прочитав эту статью, я не нашел ничего, противоречащего моей программе...И прошу, если сможешь, подскажи решение проблемы поподробнее.
 Заранее спасибо.
 |  
						| 
								|  |  
								| « Последнее редактирование: 16-03-2010 08:50 от Sel » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 15-03-2010 08:48 »  |  | 
 
 vegor, мы же общались в чате - ты пишешь и тут же читаешь один и тот же порт, а я не знаю, возможно ли это ? И не спалил ли ты порт уже своими экспериментами ?   |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| resource 
								Молодой специалист    Offline 
								Пол:    | 
								|  | « Ответ #4 : 15-03-2010 08:53 »  |  | 
 
 Алексей1153++ читать и писать в один и тот же порт конечно же возможно. Иначе было бы нужно 2 порта один чтоб писать, а другой чтоб писать    Насчет спалить порт, утверждать не буду, но мне кажется - легко. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 15-03-2010 09:06 »  |  | 
 
 resource, читать и писать в один порт - это понятно, что возможно, но он то хочет rx и tx железно соединить ) Вот как тут будет - я не знаю. А вот с двумя портами это точно возможно - обычная схема  |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #6 : 15-03-2010 09:58 »  |  | 
 
 Леш, раз можно два порта друг на друга, то и один порт сам на себя можно. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| lag 
								Участник    Offline | 
								|  | « Ответ #7 : 16-03-2010 07:13 »  |  | 
 
 А что такое in и out? Где определены? Что значит:  SetupComm(hCOM, in, out);и следом:  И главное при этом нет ошибки! Что-то ты не договариваешь. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| vegor 
								Интересующийся    Offline | 
								|  | « Ответ #8 : 16-03-2010 13:37 »  |  | 
 
 in и out входной и выходной буфер для чтения и записи , и они  определены в классе моего окна то есть в главном потоке.Во всяком случае я пробовал определять их и в главном потоке и в рабочем потоке. А SetupComm(hCOM, in, out);-ом я
 просто говорю что  in и out будут являтся моим  входным и выходным буфером для моего синхронного порта.
 И Я точно знаю что Rx и Tx можно железно связать то есть как короткое замыкание (и синхронно читать и писать) . Вот я подумал что в крайнем случае можно создать <событье> в пабочем потоке или в главном потоке которое  вечно(INFINITY)   ждал бы когда поступит кокую то информацию в вход(Rx) и когда оно приедит он возмет это и например выводит на экран . А нописать в порт можем например вот так :создадим <edit control> напишем в нем что то а потом с помощью созданной кнопки выводим это в порт , и вот тогда наше <событье> увидет что в
 <Rx> поступил данные, возмет данные и потом это будем выводить на экран .
 Вот только не знаю как реализовать это событье.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| resource 
								Молодой специалист    Offline 
								Пол:    | 
								|  | « Ответ #9 : 16-03-2010 14:34 »  |  | 
 
 vegor, может быть там есть сигналы "синронизации? Ты либо разбирайся с временными диаграмами и пинами, либо найди какой-нибудь девайс. С другой стороны, если верить http://cxem.net/comp/comp49.php , то нуль-модемный кабель именно так и сделан. В сети бесчиленное количество программ для работы с com-портом, проверенных и одобренных. Скачай какую-нибудь, чтоб уже точно знать, что именно не так: железо или софт. |  
						| 
								|  |  
								| « Последнее редактирование: 16-03-2010 14:46 от resource » |  Записан | 
 |  |  | 
	| 
			| 
					
						| lag 
								Участник    Offline | 
								|  | « Ответ #10 : 16-03-2010 15:39 »  |  | 
 
 Что хочешь сделать и так понятно! Не понятно, что у тебя такое in и out? Если буферы - так что ж такое тогда int in и int out? Совсем не похожи на буферы. Ты уверен что эти буферы у тебя существуют? Я нет. Запусти в отладке, поставь брекпойнт на hCOM = CreateFileA(); и после выполнения скажи чему равен hCOM.  Убери: PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restartGetCommState(hCOM,&dcb);
 SetCommState(hCOM,&dcb);
 SetCommTimeouts(hCOM,&to);
 
 SetupComm(hCOM,in,out);
 
 //memset(&ovr,0,sizeof(ovr));
 //ovr.hEvent =::CreateEventA(NULL,FALSE,FALSE,NULL);
 
 PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
 
 int in = 0;
 int out = 0;
 
Оно тебе совершенно ни к чему. А это что такое и зачем тебе new CbbbDlg: CbbbDlg* lpMyObject = new CbbbDlg;AfxBeginThread(MyFunction, lpMyObject,0,0,0,0);
 
Куча кнопок и поток тебе надо? Для проверки просто повесь WriteFile и сразу ReadFile на одну кнопку. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 16-03-2010 17:12 »  |  | 
 
 >>А это что такое и зачем тебе new CbbbDlg:
 вредное влияние шарпа )
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| lag 
								Участник    Offline | 
								|  | « Ответ #12 : 16-03-2010 17:54 »  |  | 
 
 вредное влияние шарпа ) Скорее каша в голове и стремление получить результат сразу. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 16-03-2010 17:58 »  |  | 
 
 есть такой момент ) Но он больше исправимый, чем вредный  |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| vegor 
								Интересующийся    Offline | 
								|  | « Ответ #14 : 17-03-2010 12:34 »  |  | 
 
 CbbbDlg* lpMyObject = new CbbbDlg;AfxBeginThread(MyFunction, lpMyObject,0,0,0,0);
 это что то стандартное средство для создания потока , и я это взял из книги . только сеичас не помню оглавление .
 Я вообше пробовал и без int in = 0; int out = 0; и взял тип <byte> для этих буферов , и пробовал с ассемблера иметь прямой доступ к ним , но результата не было.
 
 lag если я правильно понял хочешь сказать "где то while(1){WriteFile...} а в кокой небуть кнопке
 сделать  ReadFile ..." но тогда же когда программа доидет до while(1){WriteFile...} то потом не сможет выйти из бесконечного цикла . А если  WriteFile... будет без этого цикла то я не успею
 с помошью кнопки четать данные потому что оно после записи будет сушествовать очень короткое время.
 Всетаки склонен думать что решение проблемы находится в создании <событий> , ну серавно буду пробовать предлагаемые вариянты.
 и Всетаки в чем проблема программы : в логике? , ...
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| lag 
								Участник    Offline | 
								|  | « Ответ #15 : 17-03-2010 19:19 »  |  | 
 
 еще раз поставь точку останова в отладке на hCOM = OpenFile(); сделай шаг и посмотри чему равен hCOM, он должен быть больше 0. с помошью кнопки четать данные потому что оно после записи будет сушествовать очень короткое время а это ты где прочитал? сделай: void CbbbDlg::OnBnClickedButtonWrite(){
 char ch = 0x55;
 
 WriteFile(hCOM, ch, 1, &dw, NULL);
 ch = 0;
 ReadFile(hCOM, ch, 1, &dw, NULL);
 
 m_edit_int = ch;
 UpdateData(FALSE);
 }
Понажимай кнопку. А насчет потока пока погоди - убедись  сначала, что порт работает нормально. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| resource 
								Молодой специалист    Offline 
								Пол:    | 
								|  | « Ответ #16 : 17-03-2010 19:34 »  |  | 
 
 поставь точку останова в отладке на hCOM = OpenFile();сделай шаг и посмотри чему равен hCOM, он должен быть больше 0
 Там, если быть точным CreateFile. А что касается "больше 0", то в случае ошибки она вернет INVALID_HANDLE_VALUE, а это больше нуля    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| lag 
								Участник    Offline | 
								|  | « Ответ #17 : 18-03-2010 02:58 »  |  | 
 
 Там, если быть точным CreateFile каюсь - невнимательность, вместе с чтением сообщений открывал в программе файл   INVALID_HANDLE_VALUE == 0xFFFFFFFF или -1  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| resource 
								Молодой специалист    Offline 
								Пол:    | 
								|  | « Ответ #18 : 18-03-2010 06:04 »  |  | 
 
 INVALID_HANDLE_VALUE == 0xFFFFFFFF или -1  Тип HANDLE это посути дела указатель. Он не может быть отрицательным, т.к. он без знака     И поэтому INVALID_HANDLE_VALUE именно 0xFFFFFFFF, просто через -1 короче определять, и только. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #19 :  18-03-2010 07:04 »   |  | 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	|  |