странности с rs232
От: ugoday  
Дата: 11.08.04 14:08
Оценка:
Есть девайс связанный с машиной (в2к) через rs232. В него кидаешь 0х16, получаешь данные. Программу писал на VC++ с использованием апишных функций CreateFile, WriteFile, ReadFile по доке из msdn. Обнаружилась такая странность, если после перезагрузки запустить программу, она не читает данные. Если после этого послать те же самые 0х16 с помощью гипертерминала, а потом запустить прогу, то всё работает. DCB после запуска моей программы и после запуска гипертерминала одинаковые. В какую сторону рыть?
Re: странности с rs232
От: shrek  
Дата: 11.08.04 14:35
Оценка:
Здравствуйте, ugoday, Вы писали:

U>Есть девайс связанный с машиной (в2к) через rs232. В него кидаешь 0х16, получаешь данные. Программу писал на VC++ с использованием апишных функций CreateFile, WriteFile, ReadFile по доке из msdn. Обнаружилась такая странность, если после перезагрузки запустить программу, она не читает данные. Если после этого послать те же самые 0х16 с помощью гипертерминала, а потом запустить прогу, то всё работает. DCB после запуска моей программы и после запуска гипертерминала одинаковые. В какую сторону рыть?


запусти что нибудь типа portmon.exe и посмотри — как отличается инициализация у тебя и у гипер терминала.
Re: странности с rs232
От: Stanky  
Дата: 11.08.04 20:00
Оценка:
Исходник в студию!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: странности с rs232
От: AndreyAndreev Россия  
Дата: 12.08.04 05:33
Оценка:
Здравствуйте, ugoday, Вы писали:

U>Есть девайс связанный с машиной (в2к) через rs232. В него кидаешь 0х16, получаешь данные. Программу писал на VC++ с использованием апишных функций CreateFile, WriteFile, ReadFile по доке из msdn. Обнаружилась такая странность, если после перезагрузки запустить программу, она не читает данные. Если после этого послать те же самые 0х16 с помощью гипертерминала, а потом запустить прогу, то всё работает. DCB после запуска моей программы и после запуска гипертерминала одинаковые. В какую сторону рыть?


может быть ты не теми параметрами инициализируешь устройство (скорость, четность и т.д.).
похожий случай был у меня, внимательное прочтение спецификации прибора мне помогло.
icq : 196-248-172
Re: странности с rs232
От: Alex_13  
Дата: 12.08.04 08:04
Оценка:
Здравствуйте, ugoday, Вы писали:

U>DCB после запуска моей программы и после запуска гипертерминала одинаковые. В какую сторону рыть?


Возможно гипертерминал делает еще что-то, напр. устанавливает/сбрасывает флаги RTS/DTR.
Re[2]: странности с rs232
От: Аноним  
Дата: 12.08.04 10:29
Оценка:
Здравствуйте, Alex_13, Вы писали:

A_>Здравствуйте, ugoday, Вы писали:


U>>DCB после запуска моей программы и после запуска гипертерминала одинаковые. В какую сторону рыть?


A_>Возможно гипертерминал делает еще что-то, напр. устанавливает/сбрасывает флаги RTS/DTR.


Я тоже так подумал, и написал прогу, которая выводит структуру DCB. Но после гипертерминала, и после запуска моей проги вывод dcb одинаков. Вроде как это говорит о том, что флаги я установил правильно. Или нет.

Исходник.

#include "stdafx.h"
#include "rs232_1.h"
#include <stdlib.h>
#include <winbase.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

SYSTEMTIME lpsi;
DWORD dwReadSumm=0;

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
HANDLE hCom=CreateFile("Com2", GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
cout << "no openi porto" << endl;
}
else
{
DCB dcb = {0};
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
dcb.fAbortOnError=1;
dcb.fTXContinueOnXoff=1;
SetCommState(hCom, &dcb);
int i;
for(;
{
DWORD dwWrite, dwWait;
OVERLAPPED Sync = {0};
Sync.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
i=0x10;
if(Sync.hEvent == NULL)
{
//cout <<" error hEvent" << endl;
}

char chWrite=i;
for(;
{
DWORD dwWrite, dwWait;
OVERLAPPED Sync = {0};
Sync.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
i=0x10;
if(Sync.hEvent == NULL)
{
//cout <<" error hEvent" << endl;
}

char chWrite=i;
if (!WriteFile(hCom,&chWrite,1,&dwWrite,&Sync))
{
if(GetLastError() != ERROR_IO_PENDING)
{
cout << "no error_io_pending" <<endl;
}
else
{
dwWait = WaitForSingleObject(Sync.hEvent, INFINITE)\;
switch (dwWait)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(hCom, &Sync, &dwWri\te, FALSE))
{
cout << "error" <<endl;
}
break;
default:
cout <<" error WaitForSingleObject" << endl\;
break;
}
}
}
Sleep(20);
DWORD dwRead;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
char lpBuf[7];
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL)
{
cout <<" Error creating overlapped event; abort"<<endl;
}

if (!fWaitingOnRead) {
if (!ReadFile(hCom, &lpBuf, 9, &dwRead, &osReader)) {
if (GetLastError() != ERROR_IO_PENDING) // read\ not delayed?
{
cout << "Error in communications; report it\"<<endl;
}
else
{
GetLocalTime(&lpsi);
cout <<lpsi.wDay<<"."<<lpsi.wMonth<<"."<<lp\si.wYear<<" "<<lpsi.wHour<<":"<<lpsi.wMinute<<":"<<lpsi.wSecond<< " " << lpBuf<<endl;
fWaitingOnRead = TRUE;
}
}
else {
// read completed immediately
GetLocalTime(&lpsi);
cout <<lpsi.wDay<<"."<<lpsi.wMonth<<"."<<lpsi.wYear<<" "<<l\psi.wHour<<":"<<lpsi.wMinute<<":"<<lpsi.wSecond<< " " << lpBuf<<endl;
}
}
/////////////////////////////////////////////////////////////
CloseHandle(Sync.hEvent);
Sleep(3000);
}
}
CloseHandle(hCom);
}
return nRetCode;
}

Собирал в VC++ 6.0
Re[3]: странности с rs232
От: Alex_13  
Дата: 12.08.04 11:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я тоже так подумал, и написал прогу, которая выводит структуру DCB. Но после гипертерминала, и после запуска моей проги вывод dcb одинаков. Вроде как это говорит о том, что флаги я установил правильно. Или нет.


А>Исходник.


Ну чудес не бывает, значит все-таки флаги не совпадают. Проверь флаги fBinary, fDtrControl, fRtsControl — ты их вроде не устанавливаешь в коде.
Можешь проверить побитовым сравнением для уверенности
int memcmp(
   const void *buf1,
   const void *buf2,
   size_t count
);

Сохранишь одну DCB в файл, перезагрузишься, считаешь из файла и сравнишь с новой структурой DCB.

p.s. непонятно зачем создается объект CWinApp, приложение консольное...
Re[4]: странности с rs232
От: Alex_13  
Дата: 12.08.04 11:42
Оценка:
A_>p.s. непонятно зачем создается объект CWinApp, приложение консольное...

А, сам догадался это для инициализации MFC, но классы MFC нигде не используются
Re[3]: странности с rs232
От: Stanky  
Дата: 12.08.04 11:51
Оценка:
HANDLE hCom=CreateFile("Com2", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);


Обычно COM'ы открываются для эксклюзивного пользования: вместо FILE_SHARE_READ|FILE_SHARE_WRITE ставь 0!!!

DCB dcb = {0};
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
dcb.fAbortOnError=1;
dcb.fTXContinueOnXoff=1;
SetCommState(hCom, &dcb);


Сорри за тупой вопрос: а при работе с Xoff разве не нужно устанавливать количество бит данных, стоповых и чётность?
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: странности с rs232
От: Jack128  
Дата: 12.08.04 18:47
Оценка:
Здравствуйте, Stanky, Вы писали:

S>
S>HANDLE hCom=CreateFile("Com2", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
S>


S>Обычно COM'ы открываются для эксклюзивного пользования: вместо FILE_SHARE_READ|FILE_SHARE_WRITE ставь 0!!!


Дело не в том. ком порты вообще нельзя расшарить — на уровне драйвера блокируется..

S>
S>DCB dcb = {0};
S>GetCommState(hCom,&dcb);
S>dcb.BaudRate=9600;
S>dcb.fAbortOnError=1;
S>dcb.fTXContinueOnXoff=1;
S>SetCommState(hCom, &dcb);
S>


S>Сорри за тупой вопрос: а при работе с Xoff разве не нужно устанавливать количество бит данных, стоповых и чётность?


Эти параметры нужно выставлять всегда.
Re: странности с rs232
От: ugoday  
Дата: 13.08.04 04:42
Оценка:
Всем спасибо. Разобрался. Флаг ByteSyze не был выставлен.
Re[2]: странности с rs232
От: Stanky  
Дата: 13.08.04 06:39
Оценка:
> Всем спасибо. Разобрался. Флаг ByteSyze не был выставлен.
>
Устанавливай всегда: BaudRate, ByteSize, Parity, StopBits!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.