Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Com-порт  (Прочитано 20072 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vegor
Интересующийся

am
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 05-03-2010 15:21 » 

vegor, для начала - читаем теорию
https://club.shelek.ru/viewart.php?id=208
(ищи там строку "РАБОТА С КОММУНИКАЦИОННЫМ ПОРТОМ COM В ПРОГРАММАХ ДЛЯ WIN32")
Записан

vegor
Интересующийся

am
Offline Offline

« Ответ #2 : 15-03-2010 08:34 » 

Большое спосибо, Алексей1153++,  за хорошую статью , но прочитав эту статью, я не нашел ничего, противоречащего моей программе...
И прошу, если сможешь, подскажи решение проблемы поподробнее.
Заранее спасибо.
« Последнее редактирование: 16-03-2010 08:50 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 15-03-2010 08:48 » 

vegor, мы же общались в чате - ты пишешь и тут же читаешь один и тот же порт, а я не знаю, возможно ли это ? И не спалил ли ты порт уже своими экспериментами ? Улыбаюсь
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-03-2010 08:53 » 

Алексей1153++ читать и писать в один и тот же порт конечно же возможно. Иначе было бы нужно 2 порта один чтоб писать, а другой чтоб писать  Улыбаюсь

Насчет спалить порт, утверждать не буду, но мне кажется - легко.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-03-2010 09:06 » 

resource, читать и писать в один порт - это понятно, что возможно, но он то хочет rx и tx железно соединить ) Вот как тут будет - я не знаю. А вот с двумя портами это точно возможно - обычная схема
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-03-2010 09:58 » 

Леш, раз можно два порта друг на друга, то и один порт сам на себя можно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lag
Участник

ru
Offline Offline

« Ответ #7 : 16-03-2010 07:13 » 

А что такое in и out? Где определены? Что значит:
Код:
SetupComm(hCOM, in, out);
и следом:
 
Код:
int in = 0;
int out = 0;
И главное при этом нет ошибки!
Что-то ты не договариваешь.
Записан
vegor
Интересующийся

am
Offline Offline

« Ответ #8 : 16-03-2010 13:37 » 

in и out входной и выходной буфер для чтения и записи , и они  определены в классе моего окна то есть в главном потоке.
Во всяком случае я пробовал определять их и в главном потоке и в рабочем потоке. А SetupComm(hCOM, in, out);-ом я
просто говорю что  in и out будут являтся моим  входным и выходным буфером для моего синхронного порта.
И Я точно знаю что Rx и Tx можно железно связать то есть как короткое замыкание (и синхронно читать и писать) . Вот я подумал что в крайнем случае можно создать <событье> в пабочем потоке или в главном потоке которое  вечно(INFINITY)   ждал бы когда поступит кокую то информацию в вход(Rx) и когда оно приедит он возмет это и например выводит на экран . А нописать в порт можем например вот так :создадим <edit control> напишем в нем что то а потом с помощью созданной кнопки выводим это в порт , и вот тогда наше <событье> увидет что в
<Rx> поступил данные, возмет данные и потом это будем выводить на экран .
Вот только не знаю как реализовать это событье.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 16-03-2010 14:34 » 

vegor, может быть там есть сигналы "синронизации? Ты либо разбирайся с временными диаграмами и пинами, либо найди какой-нибудь девайс.
С другой стороны, если верить http://cxem.net/comp/comp49.php, то нуль-модемный кабель именно так и сделан.
В сети бесчиленное количество программ для работы с com-портом, проверенных и одобренных. Скачай какую-нибудь, чтоб уже точно знать, что именно не так: железо или софт.
« Последнее редактирование: 16-03-2010 14:46 от resource » Записан
lag
Участник

ru
Offline 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 на одну кнопку.

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 16-03-2010 17:12 » 

>>А это что такое и зачем тебе new CbbbDlg:

вредное влияние шарпа )
Записан

lag
Участник

ru
Offline Offline

« Ответ #12 : 16-03-2010 17:54 » 

Цитата
вредное влияние шарпа )
Скорее каша в голове и стремление получить результат сразу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 16-03-2010 17:58 » 

есть такой момент ) Но он больше исправимый, чем вредный
Записан

vegor
Интересующийся

am
Offline 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
Участник

ru
Offline 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
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 17-03-2010 19:34 » 

Цитата: lag
поставь точку останова в отладке на hCOM = OpenFile();
сделай шаг и посмотри чему равен hCOM, он должен быть больше 0

Там, если быть точным CreateFile. А что касается "больше 0", то в случае ошибки она вернет INVALID_HANDLE_VALUE, а это больше нуля  Ага
Записан
lag
Участник

ru
Offline Offline

« Ответ #17 : 18-03-2010 02:58 » 

Цитата
Там, если быть точным CreateFile
каюсь - невнимательность, вместе с чтением сообщений открывал в программе файл Улыбаюсь
INVALID_HANDLE_VALUE == 0xFFFFFFFF или -1
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 18-03-2010 06:04 » 

Цитата: lag
INVALID_HANDLE_VALUE == 0xFFFFFFFF или -1

Тип HANDLE это посути дела указатель. Он не может быть отрицательным, т.к. он без знака  Ага И поэтому INVALID_HANDLE_VALUE именно 0xFFFFFFFF, просто через -1 короче определять, и только.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 18-03-2010 07:04 » 

CbbbDlg* lpMyObject = new CbbbDlg;
AfxBeginThread(MyFunction, lpMyObject,0,0,0,0);
это что то стандартное средство для создания потока , и я это взял из книги . только сеичас не помню оглавление .

ой... Не из этой ли "книги" )) http://wiki.shelek.ru/index.php/FAQ:WinAPI_VCPP:%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0_%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2_%D0%B2_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D1%83_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0

Если да, то ты не правильно делаешь: ты создаёшь НОВЫЙ экземпляр диалога CbbbDlg. А зачем ?
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines