Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при работе с COM портом, Почему не работает код? 
V
    Опции темы
Ofer
Дата 9.12.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

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



Доброе время суток!
При попытке отправить данные по COM порту получаю сообщение "Параметр задан неверно"
и так же нет према данных. Зато когда заменил флаги FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED в функции CreateFile на FILE_SHARE_READ | FILE_SHARE_WRITE, то отправка проходит без проблем, но приема все равно нет.
Искал по форуму. Примеров масса! Ссылок на литературу и почие источники информации еще больше. Но только толку с этого никакого. Приблизиться к решению проблемы никак не помогло.  smile 
Пожалуйста, помогите!...

Привожу исходники
.срр
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}

DWORD WINAPI ReadComm(void*)
{
 char RArray[255];
 while(true)
 {
  TrMask = 0;
  WaitCommEvent(hThread,&TrMask,&OverWrite);
  if((TrMask&&EV_RXFLAG) == EV_RXFLAG)
  {
   ClearCommError(hPort,&Errs,&Stat);
   Kols = Stat.cbInQue;
   ReadFile(hPort,&ReadBytes,Kols,&Kols,&OverWrite);
   Form1->Label1->Caption = ReadBytes;
   ShowMessage(ReadBytes);
  }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 str = "word";
 if(!WriteFile(hPort,str,strlen(str),&dwWrite,NULL))
  ShowMessage(SysErrorMessage(GetLastError()));
 else
  ShowMessage("Данные отравлены");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 hPort = CreateFile("COM3", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);

 if(hPort == INVALID_HANDLE_VALUE)
  ShowMessage("Error opening port");
 if(!(GetCommState(hPort,&Dcb)))
  ShowMessage("Error getting port state");

 Dcb.BaudRate = CBR_9600;
 Dcb.Parity = NOPARITY;
 Dcb.ByteSize = 8;
 Dcb.StopBits = TWOSTOPBITS;
 if(!(SetCommState(hPort,&Dcb)))
  ShowMessage("Error setting port state");
 if(!(SetCommMask(hPort,EV_RXCHAR)))
  ShowMessage("Error set mask");
 OverWrite.hEvent = CreateEvent(NULL,true,false,NULL);
 if(OverWrite.hEvent == NULL)
  ShowMessage("Error creating write event");
 hThread = CreateThread(NULL,0,ReadComm,NULL,0,&ThreadID);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 PurgeComm(hPort,PURGE_TXCLEAR||PURGE_RXCLEAR);
 CloseHandle(hPort);
}
//---------------------------------------------------------------------------


.h
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ctype.h> 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
   TButton *Button1;
   TEdit *Edit1;
   TListBox *ListBox1;
   TMemo *Memo1;
   TLabel *Label1;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public:     // User declarations
   __fastcall TForm1(TComponent* Owner);
};

 TOverlapped OverWrite;
 HANDLE hThread;
 HANDLE hPort;
 DWORD TrMask,Errs,Kols,ThreadID;
 TComStat Stat;
 AnsiString ReadBytes;
  DCB Dcb;
 DWORD dwWrite,ThreadID1;
 char *str;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

PM MAIL ICQ   Вверх
UniBomb
Дата 9.12.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



Ofer, вот тут 100% рабочие примеры с описанием, сам их использую. А так я долго парился с компортами, но у меня мало чего вышло...
PM MAIL ICQ Skype   Вверх
Usper
Дата 9.12.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Параметр dwFlagsAndAttributes функции CreateFile для коммуникационных портов должен быть равен 0 или FILE_FLAG_OVERLAPPED (не помню первоисточник).


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
xvr
Дата 9.12.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тщательнее надо, тщательнее  smile 
Во первых, нафига ты позаменял бинарные | & на логические? (см строки 22 и 68) Работать не будет
Во вторых, работа в Overlapped режиме сделана неправильно (да и нафиг не нужна) WaitCommEvent в строке 21 вернется НЕМЕДЛЕННО с ошибкой ERROR_IO_PENDING, дальше нужно ждать на событии OverWrite.hEvent (WaitForSingleObject). Кроме того, в связке с ReadFile WaitCommEvent вообще не нужен

PM MAIL   Вверх
Ofer
Дата 10.12.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

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



UniBomb, огромное спасибо, отличный источник. Опираясь на этот материал переделал, теперь работает.


Цитата(Usper @  9.12.2008,  11:56 Найти цитируемый пост)
Параметр dwFlagsAndAttributes функции CreateFile для коммуникационных портов должен быть равен 0 или FILE_FLAG_OVERLAPPED (не помню первоисточник).

Usper, я так делал, не помогало. Тут в чем-то другом причина.


Цитата(xvr @  9.12.2008,  15:22 Найти цитируемый пост)
Тщательнее надо, тщательнее

xvr, как всегда по своей невнимательности smile 

PM MAIL ICQ   Вверх
Usper
Дата 11.12.2008, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ofer @  10.12.2008,  22:35 Найти цитируемый пост)
Usper, я так делал, не помогало. Тут в чем-то другом причина.

Надеюсь в окончательном варианте dwFlagsAndAttributes=0 или FILE_FLAG_OVERLAPPED?


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Ofer
Дата 11.12.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

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



Цитата(Usper @  11.12.2008,  08:30 Найти цитируемый пост)
Надеюсь в окончательном варианте dwFlagsAndAttributes=0 или FILE_FLAG_OVERLAPPED?


FILE_FLAG_OVERLAPPED

А точнее
Код

COMport = CreateFile(portname.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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