Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1187515795
RakoT
2007-08-19 13:29
2007.09.16
FileExists


2-1187687367
Quart
2007-08-21 13:09
2007.09.16
Query1.SQL.Assign(Edit1)


2-1187551133
Oleg13
2007-08-19 23:18
2007.09.16
Как правильно вычитать разницу времени


2-1187699724
Ricks
2007-08-21 16:35
2007.09.16
Отловить события для стандартных кнопок окна


15-1187538724
Piter
2007-08-19 19:52
2007.09.16
Очень классная иллюзия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский