2016-04-04 12 views
3

ile FALSE Kan ve gözyaşları ile, bir DCB yapısının fParity üyesinin etkin bir şekilde GetCommState çağırdığınızda FALSE olarak ayarlandığını öğrendim.fBYB yapısının bir üyesi her zaman bir GetCommState

Bunun için bir geçici çözüm var mı (her defasında SetCommState çağırmanız gerektiğinde, dcb.fParity = 1 dışında)? Bu sorunu hiç yaşadı mı? Bu davranışı açıklayan bir MSDN makalesi var mı?

int main() 
{ 
    HANDLE hComm; 
    DCB dcb; 

    // Replace COM1 by any COM port identifier on your PC 
    hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 
    if (hComm == INVALID_HANDLE_VALUE) 
    { 
    printf("Failed COM opening. Exit."); 
    return -1; 
    } 

    FillMemory(&dcb, sizeof(dcb), 0); 
    dcb.DCBlength = sizeof(dcb); 

    // Get the current DCB structure 
    if (!GetCommState(hComm, &dcb)) 
    { 
    printf("Failed GetCommState. Exit."); 
    return -1; 
    } 

    // [Here, you may set any or all members of the dcb structure] 
    // As suggested by chux and Hans Passant in a comment, try to set the parity to make the fParity value relevant. 
    dcb.Parity = MARKPARITY; 


    // This is the relevant bit : 
    dcb.fParity = TRUE; 

    // Set the new COM state. 
    if (!SetCommState(hComm, &dcb)) 
    { 
    printf("Failed SetCommState. Exit."); 
    return -1; 
    } 

    // Read back the COM state (fParity should be TRUE) 
    if (!GetCommState(hComm, &dcb)) 
    { 
    printf("Failed GetCommState. Exit."); 
    return -1; 
    } 

    printf("fParity = %d\n", dcb.fParity); // fParity value is 0. 

    CloseHandle(hComm); 
} 

tek değer geriye doğru GetCommState() fParity sonra okuyamaz:

İşte benim PC'de sorunu yeniden bir MCVE bu.

+0

Bunun ne olduğunu tahmin etmek zor. GetCommState(), yapılandırmayı dikkatlice geri yükledikçe, önceki bağlantı noktası kullanıcısını kullanan yapılandırmayı döndürür. Bu yaygın değil. Parite çok yaygın olarak kullanılmıyor ve varsayılan ayar kapalı. ** Her zaman ** SetCommState() yöntemini çağırmalısınız, sizin için bunu yapmak için başka bir programa güvenemezsiniz. Kullanıcının sizden önce MODE gibi bir programı çalıştırmasını istemediğiniz sürece. –

+1

Belki de alan "salt okunur" ya da en azından "Parite" alanı ile ilgili mantıklı olmalı. Bu alanı da kontrol et. (Belki "NOPARITY" ise, o zaman parite kontrolü kapalıdır. IOWs, belki de "fParity == 1" ve "Parity == NOPARITY" öğelerine sahip olamazsınız. Ayarların çeşitli kombinasyonları mantıklı değildir veya kullanılabilir değildir. – chux

+0

@HansPassant Bu sorunun nasıl yeniden üretileceğini gösteren bir MCVE olduğunu aklınızda bulundurun.Bir GetCommState() yapmak ve ilgili üyeleri ayarlamak bir DCB yapısını (en azından MSDN'ye göre) ilk olarak ayarlamak için üç yöntemden ilkidir. BuildCommDCB ile doldurabilirsiniz, ancak fParity üyesinin doğru okunamayacağı gerçeğini değiştirmez .. –

cevap

-1

Bu konuda Microsoft'la bağlantı kurdum ve yarı resmi yanıt şu: evet, fParity üye DCB yapısına sahip bir hata var, değer GetCommState() tarafından düzgün bir şekilde okunmuyor. fParity değeri her zaman yanlış olacaktır (belgeler varsayılan değerin doğru olduğunu bildirse bile).

Ayrıca, fParity işaretinin sürücü tarafından hiçbir şekilde kontrol edilmediğini ve bu hata bildirimlerinin Parity bayrak ayarına göre rapor edildiğini (veya bildirmediğini) de bildirdiler.

DCB hakkında MSDN sayfası,yapısının başka bir üyesinin,doğru olmadığı sürece etkin olmadığına işaret ettiği için, bu son bilgiler beni biraz şaşırttı. fErrorChar'un davranışı hakkında hiçbir zaman tatmin edici bir açıklama yapmadım.

MSDN belgelerinden şüpheleniyorsanız, COM sürücüsünün Microsoft'un utandığı yetenekleri hakkında yanıltıcı olması. Her neyse, bir dizi eski uygulama aniden geriye dönük uyumluluk sorunlarıyla karşılaşmadıkça bu durum düzeltilemez.

+0

Neden düşüş var? –

-1

Yukarıdaki kodunuzda, işaret ve boşluk eşitliği şeması kullanarak iletişim kuruyormuşsunuz gibi görünüyor. GetCommState'u aradığınızda, Parity alanına ne yaptınız? GetCommState beri

o ClearCommError arayarak ve ikinci dışarı argüman COMSTATCE_RXPARITY varsa kontrol yardımcı olabilir, True olarak fParity döndürmüyordur. Durumunda emin değil çalışır ya da değil, bağlantı noktası üzerinde bazı verileri aldıktan sonra ClearCommError çağıran, o çalışması gerekir.

+0

Limanda veri almaktan bile bahsetmiyorum. Çok uzaktasın. Sorun, iletişim cihazının başlangıç ​​ayarlarını yapmaya çalışırken gerçekleşir. Bilgisayarda hiçbir aygıt bağlı olmasa bile bu sorun oluşur. Başlatma meselesi, iletişim değil. –