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.
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. –
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
@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 .. –