Форум: "Прочее";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];
ВнизReadFile зависает (ComPort) Найти похожие ветки
← →
balepa © (2007-08-17 11:14) [0]Сразу извиняюсь за то, что вопрос не по Delphi (по этому собственно он в "Прочее"), задавал его на RSDN в WinApi никто неответил.
В Delphi, код работает:procedure TComThread.Execute;
var
i: integer;
begin
hComm:= CreateFile("\\.\COM1",GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if hComm<>INVALID_HANDLE_VALUE then begin
GetcommState(hComm,ComDCB);
ComDCB.DCBlength:= sizeof(ComDCB);
ComDCB.BaudRate:= CBR_9600;
ComDCB.StopBits:= OneStopBit;
ComDCB.Parity:= 0;
ComDCB.ByteSize:= 8;
ComDCB.Flags:= ComDCB.Flags xor ComDCB.Flags;
ComDCB.Flags:= ComDCB.Flags or $00000001 or ($00000030 xor $00000020) or $00004000 or $00003000;
//RTS_CONTROL_TOGGLE $00003000
SetCommState(hComm,ComDCB);
GetCommTimeouts(hComm,ComTimeouts);
ComTimeouts.ReadIntervalTimeout:= 0;
ComTimeOuts.ReadTotalTimeoutMultiplier:= 0;
ComTimeOuts.ReadTotalTimeoutConstant:= 0;
ComTimeOuts.WriteTotalTimeoutMultiplier:= 0;
ComTimeouts.WriteTotalTimeoutConstant:= 0;
SetCommTimeouts(hComm,ComTimeouts);
while ComThread.Terminated <> true do begin
Rx.nnnn[0]:= 0;
Rx.nnnn[1]:= 0;
Rx.nnnn[2]:= 0;
Rx.nnnn[3]:= 0;
ClearCommError(hComm,errors,@stat);
SetCommMask(hComm,EV_TXEMPTY);
WriteFile(hComm,Tx,6,RWBytes,nil);
WaitCommEvent(hComm,mask,nil);
sleep(6);
ReadFile(hComm,Rx,10,RWBytes,nil);
CRC:= CalculateCRC16(@Rx,8);
Rx.nnnn[0]:= Rx.nnnn[0] xor Rx.nnnn[3];
Rx.nnnn[3]:= Rx.nnnn[0] xor Rx.nnnn[3];
Rx.nnnn[1]:= Rx.nnnn[1] xor Rx.nnnn[2];
Rx.nnnn[2]:= Rx.nnnn[1] xor Rx.nnnn[2];
MW:= @Rx.nnnn[0];
PurgeComm(hComm,PURGE_RXCLEAR or PURGE_TXCLEAR);
Synchronize(ShowMW);
sleep(50);
end;
CloseHandle(hComm);
end
else begin
CloseHandle(hComm);
ComThread.Terminate;
end;
end;
В VC++ ReadFile(hComm,&Rx,10,&rxtx,NULL) "зависает" непойму в чем дело ?VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime)
{
char d[10];
TCHAR dd[10];
DWORD rxtx = 0, mask, errors,k;
HANDLE hComm;
DCB dcb;
COMMTIMEOUTS timeouts;
float mw;
COMSTAT stat;
hComm = CreateFile(L"\\\\.\\COM1",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (hComm!=INVALID_HANDLE_VALUE)
{
GetCommState(hComm,&dcb);
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_9600;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = 0;
dcb.ByteSize = 8;
dcb.fBinary = 1;
dcb.fParity = NOPARITY;
dcb.fDsrSensitivity = 1;
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fTXContinueOnXoff =0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fErrorChar = 0;
dcb.fNull = 0;
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
dcb.XoffLim = 512;
dcb.XonChar = 0;
dcb.XoffChar = 0;
dcb.XonLim = 2048;
SetCommState(hComm,&dcb); //работает проверено
GetCommTimeouts(hComm,&timeouts);
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,&timeouts); //работает проверено
Tx.addr = 0x04A6;
Tx.cmd = 0x40;
Tx.crc = 0xAD52; //44370(dec) взято из программы на Delphi
Tx.param = 0;
Sleep(500);
ClearCommError(hComm,&errors,&stat);
SetCommMask(hComm,EV_TXEMPTY);
WriteFile(hComm,&Tx,6,&rxtx,NULL);
WaitCommEvent(hComm,&mask,NULL);
Sleep(6);
if (!ReadFile(hComm,&Rx,10,&rxtx,NULL)){
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL );
wsprintf(szBuf,L"Failed with error %d: %s", dw, lpMsgBuf);
MessageBox(NULL, szBuf, L"Error", MB_OK);
LocalFree(lpMsgBuf);
ExitProcess(dw);
};
mw = Rx.nnnn;
if (mw!=0) _gcvt_s(d, 10, mw, 7);
else {
d[0] = "0";
d[1] = "\0";
}
OemToChar((LPCSTR) &d, (LPWSTR) &dd);
SendMessage(hWndStatic,WM_SETTEXT,0,(LPARAM) &dd);
PurgeComm(hComm,PURGE_RXCLEAR | PURGE_TXCLEAR);
}
CloseHandle(hComm);
}
← →
tesseract © (2007-08-17 11:17) [1]И где зависает то ? И что зависает ?
← →
Lacmus © (2007-08-17 11:22) [2]sizeof одинаковый ?
← →
balepa © (2007-08-17 11:30) [3]
> tesseract © (17.08.07 11:17) [1]
> И где зависает то ? И что зависает ?
ReadFile(hComm,&Rx,10,&rxtx,NULL),
> Lacmus © (17.08.07 11:22) [2]
> sizeof одинаковый ?
Где одинаковый ?
Если про размер отправл. и приним. данных то в Delphi"йском и С"ишном варианте указываю явно без sizeof:
WriteFile(hComm,&Tx,6,&rxtx,NULL); //&rxtx 6 байт
ReadFile(hComm,&Rx,10,&rxtx,NULL);
← →
Lacmus © (2007-08-17 11:56) [4]> balepa © (17.08.07 11:30) [3]
>Где одинаковый ?
В коде Delphi (ComDCB.DCBlength:= sizeof(ComDCB);) и VC++ (dcb.DCBlength = sizeof(dcb);)
Но если проверено (судя по комментарию), то видимо одинаковый.
В коде нет проверок возвращаемого результата SetCommMask, SetCommMask, WriteFile и т.д.
← →
balepa © (2007-08-17 12:33) [5]
> Lacmus © (17.08.07 11:56) [4]
> > balepa © (17.08.07 11:30) [3]
>
> >Где одинаковый ?
>
> В коде Delphi (ComDCB.DCBlength:= sizeof(ComDCB);) и VC++
> (dcb.DCBlength = sizeof(dcb);)
>
> Но если проверено (судя по комментарию), то видимо одинаковый.
>
>
> В коде нет проверок возвращаемого результата SetCommMask,
> SetCommMask, WriteFile и т.д.
Проверки были все нормально.
← →
balepa © (2007-08-17 12:36) [6]ComDCB.DCBlength = 28 (Delphi)
dcb.DCBlength = 28 (VC++)
← →
balepa © (2007-08-20 11:13) [7]МОжет дело в неправильной последовательности передачи байт такой структуры:
struct TTx {
WORD addr; //адрес
BYTE cmd; //команда
BYTE param; //номер параметра
WORD crc; //собственно CRC16
} Tx;
Дело в том что это запрос к измерительному прибору, и если CRC не будет корректна пакеты считаются непоступившими и следовательно ответа не будет. МОжет быть такое что Delphi и VС++ по разному "распределяют" последовательность полей и CRC не в конце пакета а где-нибудь в середине(как смог так и сказал :)) ???
← →
Anatoly Podgoretsky © (2007-08-20 13:30) [8]> balepa (20.08.2007 11:13:07) [7]
> CRC не в конце пакета а где-нибудь в середине
Это фантастика сынок.
← →
Slym © (2007-08-20 13:38) [9]balepa © (20.08.07 11:13) [7]
Может сама структура неправильно портирована?
← →
Anatoly Podgoretsky © (2007-08-20 14:21) [10]> Slym (20.08.2007 13:38:09) [9]
Это 100 процентов и ключевое слово - выравнивание
← →
имя (2007-08-20 22:33) [11]Удалено модератором
← →
имя (2007-08-20 22:34) [12]Удалено модератором
← →
balepa © (2007-08-21 06:01) [13]
> Anatoly Podgoretsky © (20.08.07 13:30) [8]
> > balepa (20.08.2007 11:13:07) [7]
>
> > CRC не в конце пакета а где-нибудь в середине
>
> Это фантастика сынок.
Так поэтому я так долго к этому "умо"заключению и шел "дедушка" :)
> Это 100 процентов и ключевое слово - выравнивание
И такая мысля была. Теперь когда еще кто-то так думает кроме меня можно и проверить
Спасибо за участие.
← →
balepa © (2007-08-21 06:24) [14]А мож CRC не явно указывать, а пересчитать в VC++?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c