Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

Какие различия при конфигурировании COM порта в XP и 98 ?   Найти похожие ветки 

 
Фёдор   (2005-05-27 15:57) [0]

Написал прогу, которая общаеться с железкой по ком порту. В 98 прога пашет отлично, а в ХР виснет на функции CloseHandle хэндла порта и на WriteFile в порт. Все говорят что в ХР надо по другому как-то настраивать порт 8) а как именно не говорят


 
wal ©   (2005-05-27 15:58) [1]

а в 98 как настраивал?


 
Фёдор   (2005-05-27 16:34) [2]

пишу на Си 8). не бейте только, я просто во всех Сишных форумах спрашивал уже, но никто ничего ответить так и не смог, поэтому решил здесь.

Вот по такому инишнику конфигурируеться порт.

; Port number. Available values: (1, 2, 3, 4)
PORT_NUMBER=2
;
; Baud rate. Available values: (110, 300, 600, 1200, 2400, 4800, 9600, 14400,
;                               19200, 38400, 56000, 57600, 115200)
BAUD_RATE=115200
;
; Data bits on controller. Available values: (7, 8)
DATA_BITS=8
;
; Parity check. Available values: (0-None, 1-Odd parity, 2-Even parity,
;                                  3-Mark parity, 4-Space parity)
PARITY=2
;
;Stop bits quantity. Available values: (0-1 Stop bit, 1-1.5 Stop bits,
;                                       2-2 Stop bits)
STOP_BITS=0
;
; DTR/DSR flow control. Available values: (0-Disable, 1-Enable, 2-Handshake)
DTR_DSR=0
;
; RTS/CTS flow control. Available values: (0-Disable, 1-Enable,
;                                          2-Handshake, 3-Toggle)
RTS_CTS=0
;
; XON/XOFF flow control. Available values: (0-Disable, 1-Enable)
XON_XOFF=0
;
; XON/XOFF characters. Actual only if XON_XOFF=1. Available values: (0..255)
; Default values: (XON_CHAR=17, XOFF_CHAR=19)
XON_CHAR=17
XOFF_CHAR=19
;
; Send address (for RS-485)
SEND_ADDR=0x48
;
; Receive address (for RS-485)
RECV_ADDR=0x48


А вот струкруты, нужные для понимания кода ниже.

typedef struct tagRsConfig {
 HANDLE        RsDev;
 COMMTIMEOUTS  RsTimeouts;
 DCB           RsDcb;
 unsigned char SndAddr;
 unsigned char RecvAddr;
 BYTE          RsID;
 DWORD         NRecvPack;
 DWORD         NSendPack;
} /*RS_CONFIG, *LPRS_CONFIG,*/ RsConfigType;

typedef struct tagRsParam
{ DWORD PortNum;  /* COM-port number       */
 DWORD Baud;     /* Baud rate             */
 DWORD DataBits; /* Quantity of data bits */
 DWORD Parity;   /* Parity check          */
 DWORD StopBits; /* Quantity of stop bits */
 DWORD DtrDsr;   /* DTR/DSR flow control  */
 DWORD RtsCts;   /* RTS/CTS flow control  */
 DWORD XonXoff;  /* XON/XOFF flow contol  */
 DWORD XonCh;    /* XON character         */
 DWORD XoffCh;   /* XOFF character        */
 DWORD SndAddr;
 DWORD RecvAddr;
} /*RS_PARAM, *LPRS_PARAM,*/ RsParamType;


А вот код конфигурирования

int RsSetup( RsParamType *SetupParam, RsConfigType *RsCfg )
{
 char PortName[16];

 memset( RsCfg, 0, sizeof(RsConfigType) );

 RsCfg->SndAddr = (unsigned char)SetupParam->SndAddr;
 RsCfg->RecvAddr = (unsigned char)SetupParam->RecvAddr;
 sprintf( PortName, "COM%d", SetupParam->PortNum );

 RsCfg->RsDev = CreateFile( PortName,
                            GENERIC_READ|GENERIC_WRITE,
                            0,         /* Exclusive access  */
                            NULL,      /* No security attrs */
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL /*|*/ /* overlapped I/O */
                            /*FILE_FLAG_OVERLAPPED*/,
                            NULL );

 if ( RsCfg->RsDev == (INVALID_HANDLE_VALUE) ) {
   return RS_ERR_OFILE;
 }

 if ( SetCommMask(RsCfg->RsDev,EV_RXCHAR) == FALSE ) {
   return RS_ERR_COMM_MASK;
 }

 if ( SetupComm(RsCfg->RsDev,RS_RX_SIZE,RS_TX_SIZE) == FALSE ) {
   return RS_ERR_SETUP_COMM;
 }

 if ( PurgeComm(RsCfg->RsDev,PURGE_TXABORT|PURGE_RXABORT|
      PURGE_TXCLEAR|PURGE_RXCLEAR) == FALSE ) {
   return RS_ERR_PURGE_COMM;
 }

 RsCfg->RsTimeouts.ReadIntervalTimeout = 0;//MAXDWORD;
 RsCfg->RsTimeouts.ReadTotalTimeoutMultiplier = 0;
 RsCfg->RsTimeouts.ReadTotalTimeoutConstant = 0;//RS_RX_MAXTIME;
 RsCfg->RsTimeouts.WriteTotalTimeoutMultiplier = 10;
 RsCfg->RsTimeouts.WriteTotalTimeoutConstant = RS_TX_SIZE;

 if ( SetCommTimeouts(RsCfg->RsDev,&(RsCfg->RsTimeouts)) == FALSE ) {
   return RS_ERR_TIMEOUTS;
 }

 RsCfg->RsDcb.DCBlength = sizeof( DCB );
 if ( GetCommState(RsCfg->RsDev, &(RsCfg->RsDcb)) == FALSE ) {
   return RS_ERR_GETCOMMSTATE;
 }

 // main parameters setup

 RsCfg->RsDcb.BaudRate = SetupParam->Baud;
 RsCfg->RsDcb.ByteSize = (BYTE)(SetupParam->DataBits);
 RsCfg->RsDcb.fParity = (SetupParam->Parity) ? (1) : (0);

 if ( RsCfg->RsDcb.fParity ) {
   RsCfg->RsDcb.Parity = SetupParam->Parity;
 }

 RsCfg->RsDcb.fBinary = TRUE;
 RsCfg->RsDcb.StopBits = (BYTE)(SetupParam->StopBits);

 // setup hardware flow control

 switch( SetupParam->DtrDsr ) {
   case 0 : RsCfg->RsDcb.fDtrControl = DTR_CONTROL_DISABLE;
            RsCfg->RsDcb.fDsrSensitivity = FALSE;
            break;
   case 1 : RsCfg->RsDcb.fDtrControl = DTR_CONTROL_ENABLE;
            RsCfg->RsDcb.fDsrSensitivity = TRUE;
            break;
   case 2 : RsCfg->RsDcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
            RsCfg->RsDcb.fDsrSensitivity = TRUE;
            break;
   default: MessageBox( NULL, "Incorrect value of DTR/DSR parameter",
                        "Parameters error", MB_OK|MB_ICONHAND );
 }

 switch( SetupParam->RtsCts ) {
   case 0 : RsCfg->RsDcb.fRtsControl = RTS_CONTROL_DISABLE;
            break;
   case 1 : RsCfg->RsDcb.fRtsControl = RTS_CONTROL_ENABLE;
            break;
   case 2 : RsCfg->RsDcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
            break;
   case 3 : RsCfg->RsDcb.fRtsControl = RTS_CONTROL_TOGGLE;
            break;
   default: MessageBox( NULL, "Incorrect value of RTS/CTS parameter",
                        "Parameters error", MB_OK|MB_ICONHAND );
 }

 switch( SetupParam->XonXoff ) {
   case 0 : RsCfg->RsDcb.fOutX = FALSE;
            RsCfg->RsDcb.fInX = FALSE;
            break;
   case 1 : RsCfg->RsDcb.fOutX = TRUE;
            RsCfg->RsDcb.fInX = TRUE;
            RsCfg->RsDcb.XonChar = (BYTE)SetupParam->XonCh;
            RsCfg->RsDcb.XoffChar = (BYTE)SetupParam->XoffCh;
            break;
   default: MessageBox( NULL, "Incorrect value of XON/XOFF parameter",
                        "Parameters error", MB_OK|MB_ICONHAND );
 }

 if ( SetCommState(RsCfg->RsDev,&(RsCfg->RsDcb)) == FALSE ) {
   return RS_ERR_SETCOMMSTATE;
 }
 
 RsCfg->NRecvPack = 0;
 RsCfg->NSendPack = 0;
 RsCfg->RsID = SetupParam->PortNum;


а вот код закрытия порта ... на функции CloseHandle всё виснет. на функции WriteFile тоже.

if ( CloseHandle(RsCfg->RsDev) ) {
   memset( RsCfg, 0, sizeof(RsConfigType) );
   return RS_OK;
 }


 
tesseract   (2005-05-28 11:39) [3]

Есть идея перед закрытием порта на всяк вызывать CancelIO(PortHandle).
И не до конца ясно как именно всё виснет. Возможно где-то в коде убёг указателя - реально я в Дельфе но сильно так с этим помучался  в НТ-ях.


 
Фёдор Мегатронов   (2005-05-29 16:24) [4]

В программе одним из главных требований была стабильность - по этому все хэндлы постоянно отслеживаются. Если вдруг их значение меняеться - об этом тут же сообщаеться.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
1-1120812160
serg_iv
2005-07-08 12:42
2005.07.25
прочитать массив по определённому адресу


14-1120148008
i-s-v
2005-06-30 20:13
2005.07.25
Что такое EMS?


3-1117915317
lockheed_man
2005-06-05 00:01
2005.07.25
Делфи и PostgreSQL


14-1120540785
Ega23
2005-07-05 09:19
2005.07.25
С днем рождения! 5 июля


8-1111735035
AlexDP
2005-03-25 10:17
2005.07.25
Поиск фрагмента изображения в картинке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский