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); ///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;
Оно тебе совершенно ни к чему. А это что такое и зачем тебе 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 » |
|
|
|
|
Записан
|
|
|
|
|