2016-07-07 103 views
6

Seri bağlantı noktasında bir sorunla karşılaştım, ancak şu ana kadar bir yanıt bulamadı. Lütfen yanlış yapsam bana bir ipucu ver veya bana bir ipucu ver. Bütün durumu mümkün olduğunca ayrıntılı olarak açıklamaya çalışacağım ve soruyu en sonunda sormaya çalışacağım. İşte gider.C#: Bir seri bağlantı noktası aygıtı için ayarlanabilir baud hızı nasıl belirlenir?

FTDI FT232RL yongasını kullanarak TTL dönüştürücüye bir USB aldım ve seri ağın nasıl çalışacağını ve kendi programımı hiper terminali yerine C# nasıl yazabileceğimi merak ettim. Kendime hızlı bir başlangıç ​​yapmak için bazı öğreticileri okuyarak programı yazmaya başladım. Öğreticilerden geçtikten sonra, baud hızı ayarları söz konusu olduğunda, okuduğum tüm öğreticilerin benzer yöntemler kullandığını fark ettim. Cihazın bunu destekleyip desteklemeyeceğini sormak yerine, tipik baud oranlarını kodlarına sabitlerler. Her zaman olabildiğince genel bir program yazmaya çalışıyorum, bundan dolayı, cihazdan nasıl bilgi alabileceğime bakmaya başladım. Aramadan sonra, this post answered by HiteshP'u çok faydalı buldum ve yazı içinde önerilen yansıtma yöntemini kullanmaya devam ettim. Yani burada benim kod gibi görünüyor: Ben MessageBox aldığım

private void UpdateBaudRateCollection() 
{ 
    mySerialPort.PortName = cboAllPortNames.SelectedItem.ToString(); 
    mySerialPort.Open(); 
    object p = mySerialPort.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(mySerialPort.BaseStream); 
    int dwSettableBaud = (int)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p); 
    mySerialPort.Close(); 
    MessageBox.Show(dwSettableBaud.ToString("X")); 
} 

sonuç o not shown in Microsoft's COMMPROP structure olduğu gibi, temsil ettiği konusunda hiçbir fikrim yok 10066B70 olduğunu.

Daha fazla arama yaptım 10066B70'in ne anlama geldiğini anlamaya çalıştım ama Basic serial port listening application numaralı telefondan Amund Gjersøe'ye kadar hiçbir yanıt bulamadım. Belki 10066B70 ile AND işlemleri ve Microsoft'un COMMPROP yapısı tarafından verilen tüm değeri gerçekleştirmek zorunda kaldı. Böylece değeri işleve attım.

private void SettableBaudRateOfDevice(int settableBaudRate) 
{ 
    const int BAUD_075 = 0x00000001; 
    const int BAUD_110 = 0x00000002; 
    const int BAUD_150 = 0x00000008; 
    const int BAUD_300 = 0x00000010; 
    const int BAUD_600 = 0x00000020; 
    const int BAUD_1200 = 0x00000040; 
    const int BAUD_1800 = 0x00000080; 
    const int BAUD_2400 = 0x00000100; 
    const int BAUD_4800 = 0x00000200; 
    const int BAUD_7200 = 0x00000400; 
    const int BAUD_9600 = 0x00000800; 
    const int BAUD_14400 = 0x00001000; 
    const int BAUD_19200 = 0x00002000; 
    const int BAUD_38400 = 0x00004000; 
    const int BAUD_56K = 0x00008000; 
    const int BAUD_57600 = 0x00040000; 
    const int BAUD_115200 = 0x00020000; 
    const int BAUD_128K = 0x00010000; 
    const int BAUD_USER = 0x10000000; 

    cboBaudRate.Items.Clear(); 

    if ((settableBaudRate & BAUD_075) > 0) 
     cboBaudRate.Items.Add(75); 
    if ((settableBaudRate & BAUD_110) > 0) 
     cboBaudRate.Items.Add(110); 
    if ((settableBaudRate & BAUD_150) > 0) 
     cboBaudRate.Items.Add(150); 
    if ((settableBaudRate & BAUD_300) > 0) 
     cboBaudRate.Items.Add(300); 
    if ((settableBaudRate & BAUD_600) > 0) 
     cboBaudRate.Items.Add(600); 
    if ((settableBaudRate & BAUD_1200) > 0) 
     cboBaudRate.Items.Add(1200); 
    if ((settableBaudRate & BAUD_1800) > 0) 
     cboBaudRate.Items.Add(1800); 
    if ((settableBaudRate & BAUD_2400) > 0) 
     cboBaudRate.Items.Add(2400); 
    if ((settableBaudRate & BAUD_4800) > 0) 
     cboBaudRate.Items.Add(4800); 
    if ((settableBaudRate & BAUD_7200) > 0) 
     cboBaudRate.Items.Add(7200); 
    if ((settableBaudRate & BAUD_9600) > 0) 
     cboBaudRate.Items.Add(9600); 
    if ((settableBaudRate & BAUD_14400) > 0) 
     cboBaudRate.Items.Add(14400); 
    if ((settableBaudRate & BAUD_19200) > 0) 
     cboBaudRate.Items.Add(19200); 
    if ((settableBaudRate & BAUD_38400) > 0) 
     cboBaudRate.Items.Add(38400); 
    if ((settableBaudRate & BAUD_56K) > 0) 
     cboBaudRate.Items.Add(56000); 
    if ((settableBaudRate & BAUD_57600) > 0) 
     cboBaudRate.Items.Add(57600); 
    if ((settableBaudRate & BAUD_115200) > 0) 
     cboBaudRate.Items.Add(115200); 
    if ((settableBaudRate & BAUD_128K) > 0) 
     cboBaudRate.Items.Add(128000); 
    if ((settableBaudRate & BAUD_USER) > 0) 
     cboBaudRate.Items.Add(3000000); 
} 

programını çalıştırdıktan sonra, aşağıdaki baud oranları elde:
300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 3000000 

Ben cihaz için Windows'un Aygıt Yöneticisi gösterilen değerlerle karşılaştırıldığında kadar işe yaradı mutlu oldu. Aygıt Yöneticisinden hızları oldu: Kendim tanımlanmış ancak değerlerin geri kalanı nereden geldi çünkü 3000000 gösterilmez:

300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600 

O baud hızı anlayabilir? Şoförde tanımlanmış olabileceğini merak etmeye başladım. Daha derine inmeye başladım ve FTDI'nin AN232B-05 Configuring FT232R, FT2232 and FT232B Baud Rates belgesini buldum. Belgenin içinde FTDI'nin sürücü yapılandırma dosyası (ftdiport.inf) hakkında yazıyor. Bunu araştırdım ve Windows sistem klasörü altında buldum. giriş şöyle görünür:

[FtdiPort.NT.HW.AddReg] 
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00 

Bu ek FT232B Alt Tamsayı bölenler kullanarak Aliasing, FTDI doküman bölüm 2.3'te gösterilen biri ile aynı görünüyor. bölüm 2.3'te talimatın ardından ve ftdiport.inf gelen ConfigData tercüme, aşağıdaki baud oranları elde:

300, 600, 1200, 2400, 4800, 9600, 19230, 38461, 57692, 115384, 230769, 461538, 923076, 14406 

Yine, aygıt yöneticisi neyi gösterdiğini aynı değildir. Cihaz yöneticisindeki baud hızının da aynı şekilde kodlanmış olup olmadığını merak ediyor. belirtildiği gibi

Required divisor = 3000000/1800 = 1666.666 
Divisor = 1666 
Sub-integer divisors = 0.6666 
Closest Sub-integer divisors = 0.625 
Closest achievable baud rate = 3000000/1666.625 = 1800.045 
Error = (1800.045-1800)/1800*100 = 0.0025% 

hata hatanın izin +/-% 3 marjı içinde iyi: 1800 cihaz yöneticisinden ftdiport.inf dosyasında gibi olabilir: Ayrıca nasıl baud hızı sayma çalıştı

Belgede, ftdiport'ta veri girişi.

1666.625 Dec = 00014682 Hex 
Data entry after re-order: 00014682 Hex => 82,46,01,00 

Bunun yerine, [82,46,01,00] hiçbir yerde ftdiport.inf dosyasında bulunabilir: inf şuna benzer bir şey olmalıdır. Ayrıca COMMPROP gelen dwMaxBaud gerçekleştirilir ve karşılık gelir sonucu 10000000 var:

BAUD_USER (0x10000000): Programmable baud rate. 

Böylece kullanıcının her iki verici ve alıcı baud hızı yerine onlar sürece gibi herhangi bir baud hızı kullanabilir ve vardır anlamına gelir hata payı içinde, doğru mu?

    : şimdiye kadar Yani

    (Sadece benim beyin bulanık biraz almaya başlıyor gibi yanlış alamıyorum emin), ben beynimde 3 farklı sonuçlar var çok karıştı
  1. Programımdan 10066B70 ne anlama geliyor?
  2. Aygıt yöneticisinin baud hızı değerleriyle karşılaştırıldığında, işlem gerçekleştiren 10066B70 ile farklı sonuçlar. Bu nasıl yapılmalıydı?
  3. Aygıt yöneticisinin baud hızı değerlerinden ve FTDI belgesinden farklı sonuçlar. İkisinin de resmi olduğu gibi hangisinin güvendiği hakkında fikrim yok.

Yazdığım her şeyi tekrar okuduğunuz için tekrar teşekkürler, oldukça uzun olduğunu biliyorum. Umarım birileri bana sorularımın cevabını verebilirdi.

* Not: 10'dan fazla itibara ulaşamıyorum, bu yüzden 2'den fazla bağlantı gönderemiyorum, bu yüzden bağlantıları bağlantıya ekledim. Anlayışın için tekrar teşekkürler.

+0

Bağlantı 1: (http://stackoverflow.com/questions/1165692/how-to-programatically-find-all [programlama HiteshP tarafından C# mevcut tüm Baudrates (SerialPort sınıfı) nasıl bulunur] -available-baudrates-in-c-sharp-serialport sınıfı) – Bou

+0

Bağlantı 2: [COMMPROP yapısı] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363189 (v = vs. 85) .aspx) – Bou

+0

@stuartd Teşekkürler. – Bou

cevap

1

Fernhill, hangisinin bir çeşit anlamlı yanıtla sonuçlandığını görmek için seri bağlantı noktası ayarlarının büyük kombinasyonlarını otomatik olarak ve hızlı bir şekilde deneyebileceğiniz bir yazılımdır.

Modbus Serial Autodetect Wizard