реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с ком портом в Eclipce CDT
promelectronshch...
сообщение Feb 9 2012, 15:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 8-11-10
Из: Украмна
Пользователь №: 60 714



Добрый день!
Установил среду разработки Eclipce CDT. Мне необходимо создать простое приложение на С++, под Windows для работы c COM портом.
Осуществлять простые операции "открыть порт - отправить/принять данные"...
Насколько я понимаю мне необходимо подключить определенную библиотеку для работы с портами, работа ведется на ОС Windows7?

Сообщение отредактировал promelectronshchic - Feb 9 2012, 15:42
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 10 2012, 05:02
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



#include "windows.h"

И почитать доку на WinAPI в части fopen(), fwrite() и fread() применительно к файлу COM-порта.

Статейка была очень доходчивая, "Работа с СОМ-портом в Windows"
Это для delphy, а та была для си, но суть-то одинаковая.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Feb 10 2012, 10:20
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(MrYuran @ Feb 10 2012, 09:02) *
И почитать доку на WinAPI в части fopen(), fwrite() и fread() применительно к файлу COM-порта.

Если уж винапи, тогда CreateFile(), ReadFile(), WriteFile(), SetCommState(), SetCommTimeouts() sm.gif
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 10 2012, 11:57
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Спасибо большое за отклик, буду пробовать.
Решил начать с простого приложения, но оказалось, что еще я не могу зайти в режим отладки.
Установил mingw-w64-bin-x86_64-20120127 , также MinGW-5.1.3 и gdb-20040521-1.

У настройках GDB debugger указал gdb, из устан. папки С:\MinGW\bin
GDB command file было .gdbinit - я так и оставил...

Больше ничего не настраивал, проект сам компилится и генерит файл .exe, но когда захожу в отладку Debug prj.exe , то пишет : "No symbol "auto" in current context" и висит ...
Что можете посоветывать?

Сообщение отредактировал Twen - Feb 11 2012, 10:49
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 11 2012, 13:46
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Операционная система у меня Windows 7 64-x Ultimate.
Оказалось у меня стояла 64 разрядная версия Eclipce, но 32 разрядная версия gcc и gdb...когда я их переустановил на 64-х битные, отладчик заработал.
Но теперь возникли пару других вопросов:
1. Не обновляется .exe файл(конечный файл приложения), когда делаю "Build all" или "Build Project"...обновляется только когда запускаю "Debug" и "Run".
2.Когда я у коде пишу функцию scanf("%i",&x), то при отладке доходя до этой функции происходит висняк, внешняя консоль не появляется для ввода какого-то символа, а когда вводить символы в консоле внизу отладка "Console", то ничего не происходит(приложение висит)...не понятно.
3.Я привык работать с железом, там есть таймеры для придерживания временных интервалов в приложении, в Борланд С++ тоже есть спец. элемент - таймер, а при написании консольных приложений под ПК, какие функции используются для этого, тоже какие-то из ОС Windows ?

Кстати, по ходу открыть порт с помощью winApi получилось, пока не на чем проверить...

Сообщение отредактировал Twen - Feb 11 2012, 20:26
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 13 2012, 08:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
а при написании консольных приложений под ПК, какие функции используются для этого, тоже какие-то из ОС Windows ?
Угу. Для начала всю работу с портом поместить в поток (_beginthread), потом в нем самом можно делать банальный Sleep()
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 13 2012, 13:06
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Я просто в шоке от этого Eclipce CDT, просто жесть, при отладке иногда ругается хотя синтаксис правильный...тонкая штука...вернусь опять на Borland C++, хватит с меня...
Go to the top of the page
 
+Quote Post
Hmm
сообщение Feb 13 2012, 14:38
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 329
Регистрация: 22-06-04
Пользователь №: 124



Цитата(Twen @ Feb 13 2012, 16:06) *
Я просто в шоке от этого Eclipce CDT, ...
Угу ... монстр для ленивых sm.gif


--------------------
Талант не пропить ...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 13 2012, 16:32
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Hmm @ Feb 13 2012, 20:38) *
Угу ... монстр для ленивых sm.gif

Очень точно подмечено - для ленивых он кажется монстромsm.gif
А если не полениться и как следует освоить этот инструмент, то он оказывается на удивление гибким и удобным.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 14 2012, 05:02
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(MrYuran @ Feb 10 2012, 08:02) *
#include "windows.h"
И почитать доку на WinAPI в части fopen(), fwrite() и fread() применительно к файлу COM-порта.
ИМХО нынче логичнее взять буст или кутэ там есть модули для работы с портами.
Как бонус и на линухе софтинка жить будет.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 16 2012, 12:20
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Хотел еще уточнить по поводу правильного приема данных из COM порта.

Такой вариант, что-то не совсем работает:

do {
if(i++ > 20) {
break;
}
ClearCommError(handle, &temp, &ComState);
} while (ComState.cbInQue != in_numbytes);

if((i < 20) & (!temp)) {
ReadFile(handle, buf_in, in_numbytes, &numbytes_ok, &Overlap);

А так некоректно писать :
sleep(1);
ReadFile(handle, buf_in, in_numbytes, &numbytes_ok, &Overlap);


Сообщение отредактировал Twen - Feb 16 2012, 12:21
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 16 2012, 13:12
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Хотел еще уточнить по поводу правильного приема данных из COM порта.
Запускаете отдельную нить чтения с COM порта. В ней, обычными блокирующими ReadFile'ами читаете ваш порт. Перед этим необходимо настроить timeout'ы чтения с порта, что бы ReadFile периодически выходил
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 16 2012, 17:40
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



А что значит запустить отдельную нить чтения...я просто с СОМ под ПК...да даже сприложениями под ПК мало работал, я обычно с железом...
Вот смотрите, я так инициализировала порт:

void ComInit(void)
{
DWORD temp;
uint16_t SizeBuffer = 1024;
COMMTIMEOUTS CommTimeOuts;
DCB dcb;

//handle = SetUpCom();
//асинхронный режим работы Com - порта
handle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
//if(handle == INVALID_HANDLE_VALUE) Status = 1;
//else Status = 0;

SetupComm(handle, SizeBuffer, SizeBuffer);
GetCommState(handle, &dcb);//заполняем поля структуры по умолчанию

dcb.BaudRate = CBR_115200;
dcb.fBinary = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fDsrSensitivity = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = 1;
SetCommState(handle, &dcb);
//0 - в слечае ошибки

/*
* Если интервал между двумя последовательными
* символами превысит заданное значение,
* операция чтения завершается и все данные,
* накопленные в буфере, передаются в программу.
* ReadIntervalTimeout — максимальное временной промежуток (в миллисекундах),
* допустимый между двумя считываемыми
* с коммуникационной линии последовательными
* символами.
*/
CommTimeOuts.ReadIntervalTimeout= 10;

/*
ReadTotalTimeoutMultiplier — задает множитель (в миллисекундах),
используемый для вычисления общего тайм-аута операции чтения.
Для каждой операции чтения данное значение умножается
на количество запрошенных для чтения символов.
*/
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;

// значений этих тайм – аутов вполне хватает для уверенного приема
// даже на скорости 110 бод
/*
* ReadTotalTimeoutConstant — задает константу (в миллисекундах),
* используемую для вычисления общего тайм-аута операции чтения.
* Для каждой операции чтения данное значение плюсуется к
* результату умножения ReadTotalTimeoutMultiplier на количество
* запрошенных для чтения символов. Нулевое значение полей
* ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant означает,
* что общий тайм-аут для операции чтения не используется.
*/
CommTimeOuts.ReadTotalTimeoutConstant = 100;

// используется в данном случае как время ожидания посылки
/*
* WriteTotalTimeoutMultiplier — задает множитель (в миллисекундах),
* используемый для вычисления общего тайм-аута операции записи.
* Для каждой операции записи данное значение умножается
* на количество записываемых символов.
*/
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

/*
* WriteTotalTimeoutConstant — задает константу (в миллисекундах),
* используемую для вычисления общего тайм-аута операции записи.
* Для каждой операции записи данное значение прибавляется к результату умножения
* WriteTotalTimeoutMultiplier на количество записываемых символов.
* Нулевое значение полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant
* означает, что общий тайм-аут для операции записи не используется.
*/
CommTimeOuts.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(handle, &CommTimeOuts);

/*
* После открытия порта первым делом необходимо сбросить его,
* так как в буферах приема и передачи может находиться “мусор”.
* Поэтому в конце примера мы применили ранее
* не известную нам функцию PurgeComm:
*/
PurgeComm(handle, PURGE_RXCLEAR);
PurgeComm(handle, PURGE_TXCLEAR);

ClearCommError(handle, &temp, &ComState);

if(!temp) {
printf("ok");
} else {
printf("error");
}


}



Мне нужен ком порт для работы через него по хмодему, после того как я отправляю пакет размером 128 байт, то я получаю символ С , а не AСK, прои повторных передачах тоже...не понятно, может это из-за того что я принимаю данные вот так:

sleep(1);
ReadFile(handle, buf_in, in_numbytes, &numbytes_ok, &Overlap);
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 16 2012, 21:17
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Кажется что-то нашел по многопоточности здесь. Нос потоками никогда не работал...это вроде как задачи у операционной системе?
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 17 2012, 07:56
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Что должно делать ваше приложение на РС? Возможно вам и многопоточность не понадобится (и OVERLAPPED режим работы COM порта)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 19:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016