Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
4-1173446863
Arfedin
2007-03-09 16:27
2007.09.16
Перевод любого гринвичского времени в местное


8-1165404177
T54
2006-12-06 14:22
2007.09.16
Вырезание куска из видеофайла


15-1187675559
tipman
2007-08-21 09:52
2007.09.16
Delphi .NET в какой версии достойный?


15-1187577985
Slider007
2007-08-20 06:46
2007.09.16
С днем рождения ! 20 августа 2007 понедельник


15-1187530512
ArtemESC
2007-08-19 17:35
2007.09.16
Шахматная программа