powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM-port асинхронная работа и чтение значений
3 сообщений из 3, страница 1 из 1
COM-port асинхронная работа и чтение значений
    #33250372
Nebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работаю с COM-портом в асинхронном режиме. Компьютер является мастером, т.е. он инициализирует передачу данных.
Принцип работы:
Компьютер посылает команду, состоящую из нескольких байт, в течение ~1 сек должен получить ответ от железки (ответ может состоять из разного кол-ва байт). После чего исходя из полученных данных, что-то меняется на форме.
Вот примерный код, как все это делается:
автор
DCB dcb;
OVERLAPPED ovr;
COMMTIMEOUTS ct;
HANDLE port;
DWORD bc;
DWORD mask;

...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
dcb.DCBlength=sizeof(DCB);
BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
dcb.fNull=TRUE;
ct.ReadIntervalTimeout=1000;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL);
SetCommTimeouts(port,&ct);
SetCommState(port,&dcb);
PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
SetCommMask(port,EV_RXCHAR);
// начало записи
BYTE* pBuf = new BYTE[2];
AnsiString sb="AC";
HexToBin(sb.c_str(), pBuf, 2);
WriteFile(port,pBuf,1,&bc,&ovr);
//конец записи
memset(&ovr,0,sizeof(ovr));
ovr.hEvent=CreateEvent(NULL,false,false,NULL);
BYTE* pBuf1 = new BYTE[2];
ReadFile(port,pBuf1,1,&bc,&ovr);

if(WaitForSingleObject(ovr.hEvent,1000)==WAIT_OBJECT_0)
{
GetOverlappedResult(port,&ovr,&bc,FALSE);
}
else
{
ShowMessage("error!");
}
ResetEvent(ovr.hEvent);
delete pBuf;
delete pBuf1;
CloseHandle(port);
CloseHandle(ovr.hEvent);
}


Вопрос#1
С этим кодом возникли следующие проблемы, когда кликаем на Button1 первый раз все нормально байт отправился и байт получил (стоит перемычка Tx-Rx + LGComSpy++, Portmon). Когда жму на кнопку второй раз выскакивает ShowMessage("error!"). В чем может быть проблема?
Вопрос#2
Как сделать отдельный обработчик что-то вроде onReceiveData, который бы вызывался как только получен первый байт пакета (при условии что известен максимальный размер пакета, напрмер 10 байт)
Вопрос#3
Как организовать 9-битную передачу? Я так понимаю что 9 бит это бит паритета? как им управлять и читать его?

ЗЫ. Буду признателен если разъясните как что сделать и какие ошибки я сделал :)
...
Рейтинг: 0 / 0
COM-port асинхронная работа и чтение значений
    #33250561
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Use seperate thread to wait for event and then PostMessage to the Main thread. React on this Event.

2. WriteFileEx/ ReadFileEx.
...
Рейтинг: 0 / 0
COM-port асинхронная работа и чтение значений
    #33250839
Nebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreiNz1.Use seperate thread to wait for event and then PostMessage to the Main thread. React on this Event.
угу, спасиб. а вот если сделать wait for event не в отдельном thread, а в Application->OnIdle запихнуть?
AndreiNz2. WriteFileEx/ ReadFileEx.
Я несовсем корректно выразился наверное, про эти функции я знаю спасибо. :)

а кто что может сказать насчет 9 битной передачи?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM-port асинхронная работа и чтение значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]