Picproje Elektronik Sitesi

BİLGİSAYAR => Donanım ve Yazılım => Konuyu başlatan: z - 27 Mayıs 2015, 20:45:28

Başlık: Setcommstate fonksiyonundaki saçmalık
Gönderen: z - 27 Mayıs 2015, 20:45:28
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/)
Başlık: Ynt: Setcommstate fonksiyonundaki saçmalık
Gönderen: bocek - 27 Mayıs 2015, 20:59:36
Ş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;
}
Başlık: Ynt: Setcommstate fonksiyonundaki saçmalık
Gönderen: z - 27 Mayıs 2015, 21:10:11
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.

Başlık: Ynt: Setcommstate fonksiyonundaki saçmalık
Gönderen: bocek - 27 Mayıs 2015, 22:46:44
Ş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)?
Başlık: Ynt: Setcommstate fonksiyonundaki saçmalık
Gönderen: z - 27 Mayıs 2015, 23:51:38
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.