Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблемы с serial port

8.2K
08 сентября 2004 года
yurikg1
2 / / 08.09.2004
Привет всем!

у меня след. проблема - я пишу программку в Borland C++ Builder, которая бы читала и писала в синхронном режиме в ком-порт, речь идет о работе с устройством, который работать с радио-траспонтерами.
Я нормально открываю порт, я могу писать, но у меня возникают проблемы с чтением информации из ком-порта. Т.е., в принципе, там должен быть действительно довольно простой код с ReadFile.
Я открываю порт следующим кодом:
{
DCB dcb;
HANDLE hCom;
BOOL fSuccess;
char *pcCommPort = "COM2";

hCom = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0,
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);

if (hCom == INVALID_HANDLE_VALUE)
{
printf ("CreateFile failed with error %d.\n", GetLastError());
return (1);
}

fSuccess = GetCommState(hCom, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("GetCommState failed with error %d.\n", GetLastError());
return (2);
}

// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.

dcb.BaudRate = 230400; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

fSuccess = SetCommState(hCom, &dcb);

if (!fSuccess)
{
// Handle the error.
printf ("SetCommState failed with error %d.\n", GetLastError());
return (3);
}

printf ("Serial port %s successfully reconfigured.\n", pcCommPort);
return (0);
}

Т.е. в программу я не использую Threads, потому что принципе коммуникации довольно простой Request - Response, все инициируется только хост-системой, в данном случае устройство является пассивным.

У меня есть функция, которая пишет в порт, довольно простая функция.

//--------------------------------------------------
int WriteCommPort (char* buffer, int length)
DWORD dBytesWritten;
WriteFile(hCom, &buffer, length,&dBytesWritten);
//---------------------------------------------------
Ну сюда можно еще включить обработку
Pending I/o Error
Но похоже, эта функция работает нормально
Что у меня не получается, так это читать из ком-порта. Я уже попробовал разные варианты -
самый простой просто с ReadFile, потом включил обработку WaitCommEvent (хоть она там, собственно, ненужна, потому что, как я уже сказал, устройство не инициирует само никаких коммуникационных процессов, а ждут запроса, на который посылает ответ).
Может мне кто-то посоветовать, как можно реализовать такой вроде бы несложный процесс (в данном, случае, меня особенно интересует чтения порта) - Request-Response. Т.е. в данном случае мы даже абстрагируемся от CRC-проверки (для debbuging purposes, можно ее исключать из запроса).
Я уже прочитал море документации, и не могу понять, почему у меня не читается порт. Более того, в некоторых случаях я посылаю устройствю команду, потом читаю порт, и получаю эту же команду (!). Хоть этого не может буть, ответ от устройства всегда имеет другой формат.
Заранее спасибо. Юрий
1.8K
13 сентября 2004 года
_const_
229 / / 26.11.2003
Есть еще т.н. COMMTIMEOUTS, попробуй с ними поиграться. Если не поможет - проверь настройки управления потоком у прибора и твоей программы. Скорее всего грабли где-то здесь.
10K
21 сентября 2005 года
takedo
13 / / 28.06.2005
Так никаких проблем:
OVERLAPPED o;
o обнуляем, создаем евент занятый с ручным сбросом
куе = ReadFile(,количество нужных байт,,&o)-асинхронно
if(!куе)
{
if(GetLastError != ERROR_IO_PENDING)
{
-писец, приплыли
}
WaitForSingleObject(o.hEvent,TIMEOUT)
и т д
}else - все считалось, можешь ещё и GetOverlappedResult
243
21 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
yurikg1, вы читали, читали, но определенно многое не дочитали.
Во первых - где установка таймаутов чтения/записи COM-порта (SetCommTimeouts(...))?
Во вторых - почему не указали длинну DCB? В виде sizeof(DCB).
В третьих - если уж взялись вручную заполнять DCB, то делайте это до конца, иначе применяйте BuildCommDCB(...) (что я вам настоятельно рекомендую). В противном случае никому не известно, как у вас сконфигурируется порт. Длинну структуры указать необходимо в любом случае!
В четвертых - вы не установили длинну буферов чт/зп для порта (SetupComm(...)).
По поводу того, что вы читаете из порта то, что вы туда записали - нет ничего удивительного. Вы не производите "очистку" порта ф-цией PurgeComm(...).
Пример функции конфигурирования порта:
Код:
DCB           dcb;//указатель на структуру для конфигурирования СОМ порта
COMMTIMEOUTS  ct;//структура для установки таймаутов чтения/записи порта
HANDLE port;

HANDLE ConfPort(AnsiString port_name)
{
        HANDLE port=NULL;
        bool Ok=0;
        dcb.DCBlength=sizeof(DCB);
        BuildCommDCB("baud=14400 parity=N data=8 stop=1",&dcb);
        dcb.fNull=TRUE;

        ct.ReadTotalTimeoutConstant=250;
        ct.ReadIntervalTimeout=200;
        ct.ReadTotalTimeoutMultiplier=0;
        ct.WriteTotalTimeoutMultiplier=0;
        ct.WriteTotalTimeoutConstant=0;

        port=CreateFile(port_name.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

        PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
        SetupComm(port,256,256);     Ok=(SetCommState(port,&dcb))&&(SetCommTimeouts(port,&ct));
        if(Ok)return port;
        return NULL;
}

Если теперь не разберетесь с записью/чтением, то могу выложить и их.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог