Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Прием данных через com-порт


Автор: Fantom87 3.1.2012, 13:35
Доброго времени суток.
Задача такая... Микроконтроллер посылает на 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, к примеру.
Расскажите пожалуйста поподробнее, как это сделать. Или просто готовый код киньте, разберусь.

Автор: Dem_max 3.1.2012, 13:40
тут посмотреть
http://sources.ru/cpp/cpp_system.shtml#7

Автор: bass 3.1.2012, 15:53
Код

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 раз
}



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




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

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

Автор: Fantom87 4.1.2012, 17:12
Нашел! smile 
Вот отличная статья с описанием и исходниками в C++Builder'е
http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html

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

Автор: Dem_max 5.1.2012, 09:01
Цитата(Fantom87 @ 4.1.2012,  17:12)
Нашел! smile 
Вот отличная статья с описанием и исходниками в C++Builder'е
http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)