Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Работа с COM портом. Не читает.


Автор: Den64 6.2.2007, 00:33
  К компорту ничего неподключено, выход(Tx) соединён со входом(Rx) порта. Т.е что передано из порта то и должно быть принято.
  Открытие порта и передача работают правильно, а приём возвращает False.
  Не найду ошибку, подозреваю функцию ReadCOM.
  Подскажите что нетак делаю. (Хоть какие предположения плиз)

Код


void __fastcall TForm1::Button1Click(TObject *Sender)  //кнопка
  {
   static unsigned char OutMassageCOM[16];
   static unsigned char InMassageCOM[16];

   HANDLE p=OpenCOM("COM1"); // открывает порт

   OutMassageCOM[0]=1;   
   WriteCOM(p,OutMassageCOM,1); // передаёт сообщение длинной 1 байт

   Sleep(80); //ждёт 80 мСек

   if (ReadCOM(p,InMassageCOM,1))  Edit3->Text="Ok";// приём (возвр ошибку)
   else   Edit3->Text="Error";

   CloseHandle(p); // закрывает порт
  }

bool ReadCOM(HANDLE COMFile, void * buffer, int count = 1)// чёта ниправильна
  {
   unsigned long int a = 0;
   return ReadFile(COMFile,
            buffer,
            count,
            &a,
            NULL);
  }

HANDLE OpenCOM(char * NameCOMPort)
  {
   return CreateFile(NameCOMPort,                
                     GENERIC_READ/GENERIC_WRITE, 
                     0,                          
                     NULL,                       
                     OPEN_EXISTING,              
                     FILE_ATTRIBUTE_NORMAL,      
                     0);                         
  }

bool WriteCOM(HANDLE COMFile,void* buffer, int count = 1)
  {
   unsigned long int a1 = 0;
   unsigned long int* a=&a1;
   return WriteFile(COMFile, 
                    buffer,  
                    count,   
                    a,       
                    NULL);   
}


Автор: Romikgy 6.2.2007, 00:47
Цитата(Den64 @  5.2.2007,  23:33 Найти цитируемый пост)
Т.е что передано из порта то и должно быть принято.

эт те не lpt порт, у сом порта 2 буфера на передачу и на прием, из этого следует , что , то что ты передал на передачу ты никогда не прочитаешь заново,
а было бы синхроное чтение, то получил бы висяк

Автор: Den64 6.2.2007, 01:23
Спасибо за отает Romikgy.

На щёт таво что то что передал больше не примешь я несогласен, всё что поступило на вход сохраняется во входном буфере до прочтения.
 Подключал вход и к устройству. Устройство отвечает, но прочитать немогу.

Автор: Anikmar 6.2.2007, 13:51
А что GetLastError говорит? Что за ошибка конкретно?

Автор: Den64 6.2.2007, 20:37
Не проверял на счёт GetLastError. Щас проверю. Спасибо.

Автор: Den64 6.2.2007, 23:27
GetLastError возвращает 5.

В помощи(C++Builder6)  пока ненашол..

Автор: Romikgy 6.2.2007, 23:36
Код

LPVOID lpMsgBuf;
 
FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
);

// Display the string.
MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

// Free the buffer.
LocalFree( lpMsgBuf );


Автор: Den64 8.2.2007, 11:43
С помошью подсказок Romikgy и Anikmar нашол жука.
GetLastError выдавала 5.
Воспользовался функцией FormatMessage выдала: Отказано в доступе.
Затем я увидел что у меня вместо символа "|" стоит символ "/".

Код


HANDLE OpenCOM(char * NameCOMPort)
  {
   return CreateFile(NameCOMPort,                
                 // GENERIC_READ/GENERIC_WRITE, 
  /*нужно*/  GENERIC_READ|GENERIC_WRITE,
                     0,                          
                     NULL,                       
                     OPEN_EXISTING,              
                     FILE_ATTRIBUTE_NORMAL,      
                     0);                         
  }

Разрешена была только запись.

Автор: Sleepman 27.2.2007, 13:01
Цитата(Den64 @  6.2.2007,  00:33 Найти цитируемый пост)
К компорту ничего неподключено, выход(Tx) соединён со входом(Rx) порта. Т.е что передано из порта то и должно быть принято.


Мне необходимо нечто похожее, поэтому поинтересуюсь у автора...
другие пины разъема висят открытыми (пин заземления не надо никуда совать - заземлять),
Не хочу просто комп убить.

У меня задача похожая... но в конечном итоге выглядит не так.
Мне нужно написать драйвер, пристыковать его к стандартным драйверам послед. порта и в
момент происхождения прерывания... он должен, ну хотя бы что-нибудь "крикнуть".

Начну хотя бы с user-mode ... приложения
Металл перемычки, кстати, не имеет значения?

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