PC ile belli bir baud rate ile konuşmakta olan kartım, PC ile anlaşıp baudrate değerini değiştirmeye karar veriyor.
Gel gelelim windowsun bir fonksiyonu olan setcomstate ile baud rate değeri değiştirilirken normalde "1" de tuttuğum DTR pini "0"a çekiliyor.
Halbuki uygulamda Baud rate değişirken DTR pin konumunun değişmemesi gerekiyor.
Bu sorunu aşmanın bir yolu varmı?
Elmikiyle gerdeğe girince böyle oluyor işte.
http://edavies.me.uk/win32-serial-bug/ (http://edavies.me.uk/win32-serial-bug/)
Şurada bir şeyler anlatılmış:
http://forums.codeguru.com/showthread.php?291244-Controlling-DTR-line-of-serial-port (http://forums.codeguru.com/showthread.php?291244-Controlling-DTR-line-of-serial-port)
Anlamam etmem ama DTR pini, DCB struct'ı içindeki fDtrControl değişkeni ile kontrol ediliyor galiba.
h_Port = CreateFile(m_PortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
GetCommState(h_Port,&m_dcb);
m_dcb->fDtrControl=DTR_CONTROL_ENABLE;
SetupComm(h_Port,4096,4096);
if (!SetCommState(h_Port,m_dcb))
{
MessageBox("Open serial port failed");
return 0;
}
O örnekte flow control için DTR pininin kullanılacağı belirtilmiş.
Bende flow control yok. DTR yi PC deki yazılımla istediğim zaman değiştiriyorum ve kartı resetlemeye yarıyor.
PC baud rate değerini değiştirince DTR pinini lowa çektiği için kartımı resetlemiş oluyor.
Bu durum senaryoma ters düşüyor. PC baud değerini değiştirsin ve iletişime devam etsin istiyorum.
Şurada bir çözüm getirilmiş gibi ama sizin işi çözer mi bilmiyorum.
https://codereview.qt-project.org/#/c/76735/
DTR sinyalini EscapeCommFunction() ile kontrol edin, DCB ile de diğer değişiklikleri yapın gibi bir şeyler söylüyor.
fDtrControl = DTR_CONTROL_DISABLE;
yapıp DTR sinyali gönderme işini de EscapeCommFunction() ile yapsanız nasıl olur (belki de zaten öyle yapıyorsunuz)?
Soft olarak Baudrate ayarlamaktan vazgeçtim. Belliki windows updatelerle falan ileride başım derde girebilir.
Reset rutininde jumper konumlarını okuyup baudrate ayarlamasını yapmaya karar verdim. 3 pinim bu iş için alıkonuldu ama en azından başım ağrımayacak.