hcom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
if (hcom != INVALID_HANDLE_VALUE)
Memo1->Lines ->Add("Handle create successeful");
else retern;
int i;
i = PurgeComm(hcom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR | PURGE_RXCLEAR);
if (i == Null()) return;
if ((i=ClearCommBreak(hcom))==Null()) return;
DCB dcb;
if ((GetCommState (hcom, &dcb))==Null()) return;
dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if ((i=SetCommState(hcom, &dcb))==Null()) return;
DWORD CommEventMask = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |
EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;
if ((i = SetCommMask(hcom, CommEventMask))==Null()) return;
const char CMD[5] = {0x02, 0x03, 0x40, 0x00, 0x03};
char cmd[5] = {0x00, 0x00, 0x00, 0x00, 0x00};;
OVERLAPPED OL;
OL.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD EventMask = 0;
DWORD dwWrited;
bool sucss = WriteFile (hcom, (void*)CMD, 5, &dwWrited, &OL);
if (!sucss) return;
int dwread;
do {
i = WaitCommEvent(hcom, &EventMask, &OL);
if ((!i) && (GetLastError()==ERROR_IO_PENDING))
{
Memo1->Lines->Add("Waiting for event");
WaitForSingleObject(OL.hEvent, INFINITE);
}
if(EventMask || EV_RXCHAR)
Memo1->Lines->Add("Event RXCHAR");
DWORD ErrorMask = 0;
COMSTAT CStat;
ClearCommError(hcom, &ErrorMask, &CStat);
DWORD quelen = CStat.cbInQue;
DWORD dwReaded = 0;
i = ReadFile(hcom, (void*)cmd, quelen, &dwReaded, &OL);
if(EventMask & EV_RXCHAR)
Memo1->Lines->Add(cmd);
dwread = dwReaded;
if( dwReaded == 0 && GetLastError() == ERROR_IO_PENDING )
{
i = GetOverlappedResult(hcom, &OL, &dwReaded, FALSE) ;
}
else
{
if (dwReaded>0)
Memo1->Lines->Add("");
else
Memo1->Lines->Add("error reciving");
}
PurgeComm(hcom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
EventMask=0;
ResetEvent(OL.hEvent);
}while(dwread==0);
CloseHandle(hcom);
Не могу считать с СОМ порта
в мануале контроллера в настройках порта указано только:
BaudRate=CBR_9600;
ByteSize=8;
Parity=NOPARITY;
StopBits=ONESTOPBIT;
проверка линии идет кодами:
0x02, 0x03, 0x40, 0x00, 0x03
должен ответить:
0x02, 0x03, 0x40, 0x00, 0x06
отправляю/принимаю команды:
Код:
в cmd приходит только первый байт 0x15
то же самое если делать через компоненту TComPort
где и какие настройки порта покопать, или что я не правильно делаю?
Цитата: oxotnik333
в cmd приходит только первый байт 0x15
то же самое если делать через компоненту TComPort
где и какие настройки порта покопать, или что я не правильно делаю?
Проверь верно ли задается выполнение условия - код особо не просматривал - времени нет. Но я бы первое что сделал - установил точку останова на цикл do{}while и проверил по какому условию он завершается и то ли это условие которого ты ожидаешь - ведь судя по всему чтение одного байта всетаки происходит?
1-й раз ничего не читается (наверно дело в таймаутах)
во 2-й раз и попадает этот 1 байт...
пробовал while(true) та же история... больше одного байта не считывает
PS: сам девайс работает нормально... родная его софтина все делает