Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прием данных через com-порт 
V
    Опции темы
Fantom87
  Дата 3.1.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Задача такая... Микроконтроллер посылает на com-порт данные по протоколу RS-232. Через Hyperterminal эти данные вижу, всё работает.
Подскажите пожалуйста, как теперь программно обработать эти данные?
Программку пишу в C++Builder. Решил пойти по пути использования WinAPI.
Открытие порта проходит нормально, как я понимаю...
Код

DCB dcb;
HANDLE hCom_1 = NULL;
.............
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 hCom_1 = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 if (hCom_1 == INVALID_HANDLE_VALUE)
  ShowMessage ("Com port error");
 if (!GetCommState (hCom_1, &dcb))
 {
  CloseHandle (hCom_1);
  ShowMessage ("GetCommState error");
 }
 dcb.BaudRate = CBR_9600;
 dcb.ByteSize = 8;
 dcb.StopBits = ONESTOPBIT;
 dcb.Parity = NOPARITY;
 if (!SetCommState (hCom_1, &dcb))
 {
  CloseHandle (hCom_1);
  ShowMessage ("SetCommState error");
 }
}

Проблема теперь в том, как данные с этого порта прочитать и вывести куда-нибудь, в тот же Edit, к примеру.
Расскажите пожалуйста поподробнее, как это сделать. Или просто готовый код киньте, разберусь.
PM MAIL   Вверх
Dem_max
Дата 3.1.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



тут посмотреть
Работа с СОМ портом


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bass
Дата 3.1.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Код

DWORD WINAPI ConnectCom(void *Param)
{
BYTE Buffer = 0;
DWORD Bytes;
        while(1)
        {
        ReadFile(HanPORT,&Buffer,4,&Bytes,0);
        if(Bytes == 1)
        {
        Form1->Memo1->Text=Form1->Memo1->Text+"0X"+IntToHex(Buffer,2)+" " ;
        }
        Sleep(1);
        }
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{

//здесь инициализация порта

DWORD GO =0 ;
CreateThread(NULL,0,ConnectCom,0,0,&GO); //запускать 1 раз
}



Делал вот так запустив в отдельном потоке.. Правда желательно пользоваться потоками которые создаются инструментами билдера...




PM MAIL   Вверх
xvr
Дата 3.1.2012, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



В Builder'е вызывать метода объектов VCL из отдельных потоков категорически нельзя. Для этого нужно пользоваться классом TThread и его методом Synchronize.

Так же не имеет особого смысла открывать СОМ порт в OVERLEPPED режиме (если его Read/Write запущенны в отдельном потоке)

PM MAIL   Вверх
Fantom87
Дата 4.1.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2007

Репутация: нет
Всего: нет



Нашел! smile 
Вот отличная статья с описанием и исходниками в C++Builder'е
Работа с COM-портом с помощью потоков

Всем спасибо!
PM MAIL   Вверх
Dem_max
Дата 5.1.2012, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата(Fantom87 @ 4.1.2012,  17:12)
Нашел! smile 
Вот отличная статья с описанием и исходниками в C++Builder'е
Работа с COM-портом с помощью потоков

Всем спасибо!

Я тебе примерно как минимум 3 примера привел, один из которых исходник от Microsoft, видимо ты читать не умеешь


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.