2016-04-06 47 views
-1

Aşağıdaki kod, iletişim gerçek bir seri bağlantı noktasından geçerken beklendiği gibi çalışır. Proses, ReadFile üzerindeki blokları engeller ve işleme başlamadan önce seri tamponun doldurulmasını bekler. Ancak, bir seri bağlantı noktasını öykünen bir USB aygıtı bağladığımda, Tampon'dan hiçbir veri geçmediğinde bile ReadFile engellenmeyecektir.Seri Haberleşmeler bir öykünülmüş bağlantı noktasında engellenmiyor

aşağıdaki çıktıyı almak USB bağlantılı cihazdan her saniye ...

RVal = 1 ch = -52 bytesRead = 0

Yani hiçbir hata döndürülür ve okuma bayt I dek hep 0 olan USB bağlantı noktasından bayt gönder.

DWORD rVal; 
HANDLE handle; 
BOOL isGood; 
char Ch; //Temporary character used for reading 
DWORD bytesRead; 

handle = CreateFile(L "\\\\.\\COM4",   //port name 
    GENERIC_READ | GENERIC_WRITE,     //Read/Write 
    0,           // No Sharing 
    NULL,           // No Security 
    OPEN_EXISTING,        // Open existing port only 
    0,           // Non Overlapped I/O 
    NULL);          // Null for Comm Devices 

if (handle == INVALID_HANDLE_VALUE) 
{ 
    return INVALID_HANDLE_VALUE; 
} 

isGood = SetCommMask(handle, EV_RXCHAR); 
if (isGood == false) 
{ 
    return USV_ERR_READER_COM; 
} 

rVal = ReadFile(handle,   //Handle of the Serial port 
     &ch,  //Temporary character 
     sizeof(ch),//Size of TempChar 
     &bytesRead, //Number of bytes read 
     NULL); 
... 
+0

Bu sorunu hiç veya benim müşterilerim kutularında görmedim. –

+0

Bağlı 4-5 crossover (CTS-RTS) var mı? Sadece 2, 3 ve 7'ye sahipseniz, xon/xoff protokolünü kullanmanız gerekecektir. – cup

+0

Yukarıdaki kodla bir RS232 seri portuna bağlı bir cihaz kullanmamda herhangi bir sorun yaşamadım. ReadFile, bayt bağlantı noktası geçene kadar beklendiği gibi engeller. Bir USB aygıtı bağladığımda, hiçbir bayt öykünülmüş bağlantı noktasından geçiyor olsa da, ReadFile engellenmez. Şaşkınım. –

cevap

-1

Sorun, iletişim zaman aşımlarını almadım veya ayarlamamdı. ReadFile için WinAPI, bu ayarlanması gerektiğini ve ayarlanmamışsa davranışın öngörülemez olduğunu belirtir. Şimdi aşağıdaki kod sürekli olarak birkaç seri cihazda çalışır.

Bunu düşüren kişiye, başınızı ıslatın.

// W32SerialLibrary.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include<windows.h> 
#include<stdio.h> 

#define SEL  4 // marks the end of the message. it should only appear after a NAK/ACK and never by itself. 
#define ACK  6 // the last character before the end of the message 
#define NAK  21 // the last character before the end of the message 
#define GS  29 // indicates the start of a message. 

#define MAX_BUFFER 512 

void convertCharToWchar(const char *fromCharBuffer, wchar_t *toWcharBuffer, size_t toWcharBufferSize) 
{ 
    int i; 

    for (i = 0; fromCharBuffer[i] != '\0' && i < toWcharBufferSize; i++) 
    { 
     toWcharBuffer[i] = fromCharBuffer[i]; 
    } 

    toWcharBuffer[i] = '\0'; 
} 

int readMRZ(const char *portPath, char *mrzBuffer, const size_t mrzBuffer_size) 
{ 
    HANDLE hComm; 
    DCB dcbSerialParams; 
    BOOL isGood; 
    COMMTIMEOUTS commTimeOuts; 
    char mrzChar; //Temporary character used for reading 
    DWORD bytesRead; 
    int mrzIndex; 
    DWORD maskUsed; 
    char errorChar = '_'; 
    wchar_t wportPath[MAX_PATH]; 

    convertCharToWchar(portPath, wportPath, sizeof(wportPath)); 

    hComm = CreateFile(wportPath,    //port name 
     GENERIC_READ | GENERIC_WRITE,     //Read/Write 
     0,           // No Sharing 
     NULL,           // No Security 
     OPEN_EXISTING,        // Open existing port only 
     0,           // Non Overlapped I/O 
     NULL);          // Null for Comm Devices 

    if (hComm == INVALID_HANDLE_VALUE) 
    { 
     printf("Error in opening serial port\n"); 
     return -1; 
    } 

    // setup connection 

    dcbSerialParams = { 0 }; // Initializing DCB structure 
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams); 

    isGood = GetCommState(hComm, &dcbSerialParams); 

    dcbSerialParams.BaudRate = CBR_9600; // Setting BaudRate = 9600 
    dcbSerialParams.ByteSize = 8;   // Setting ByteSize = 8 
    dcbSerialParams.StopBits = ONESTOPBIT;// Setting StopBits = 1 
    dcbSerialParams.Parity = NOPARITY; // Setting Parity = None 

             // setup listener 

    isGood = SetCommState(hComm, &dcbSerialParams); 
    if (isGood == false) 
    { 
     printf("Error %d\n", GetLastError()); 
     return -1; 
    } 

    GetCommTimeouts(hComm, &commTimeOuts); 

    isGood = SetCommMask(hComm, EV_RXCHAR); 
    if (isGood == false) 
    { 
     printf("Error %d\n", GetLastError()); 
     return -1; 
    } 

    mrzIndex = 0; 

    commTimeOuts.ReadTotalTimeoutConstant = 0; 
    commTimeOuts.ReadTotalTimeoutMultiplier = 0; 
    commTimeOuts.WriteTotalTimeoutConstant = 0; 
    commTimeOuts.WriteTotalTimeoutMultiplier = 0; 
    commTimeOuts.ReadIntervalTimeout = 500; 

    SetCommTimeouts(hComm, &commTimeOuts); 
    maskUsed = 0; 
    WaitCommEvent(hComm, &maskUsed, NULL); 
    commTimeOuts.ReadIntervalTimeout = 0; 

    do 
    { 
     isGood = ReadFile(hComm,  //Handle of the Serial port 
      &mrzChar,     //Temporary character 
      sizeof(mrzChar),   //Size of TempChar 
      &bytesRead,     //Number of bytes read 
      NULL); 

//  printf("isGood %d ch=%c dec=%d oct=%#o hex=%#08X maskUsed=%x bytesRead=%d\n", isGood, mrzChar, mrzChar, mrzChar, mrzChar, maskUsed, bytesRead); 

     if (mrzChar == GS) 
     { 
      mrzIndex = 0; 
      continue; 
     } 

     if (mrzChar == ACK) 
     { 
      mrzBuffer[mrzIndex] = '\0'; 
      break; 
     } 

     // fill buffer 
     if ((mrzChar >= 48 && mrzChar <= 90) || mrzChar == '<' || mrzChar == errorChar || mrzChar == '\r') 
     { 
      if (mrzIndex == MAX_BUFFER) 
      { 
       exit(-1); 
      } 

      if (mrzChar == '\r') 
      { 
       mrzBuffer[mrzIndex++] = '\n'; 
      } 

      mrzBuffer[mrzIndex++] = mrzChar; 
     } 
    } 

    while (bytesRead > 0); 

    CloseHandle(hComm);//Closing the Serial Port 

    return 0; 
} 

int main() 
{ 
    char mrzBuffer[512]; 
    int rVal; 

    rVal = readMRZ("\\\\.\\COM1", mrzBuffer, sizeof(mrzBuffer)); 

    printf("\nrVal=%d mrzBuffer length=%d\n", rVal, strlen(mrzBuffer)); 
    printf("mrzBuffer=\n\"%s\"\n", mrzBuffer); 

    return rVal; 
} 
+0

Sizin downgrade yararlı değil.Ben kazandınız, kaybedersiniz. –