Virtual COM Port Nedir ?

COM Port bilgisayarlarda seri port anlamına gelir. Günümüz bilgisayarlarında, endüstriyel bilgisayarlar haricinde seri port kullanan bilgisayar kalmamıştır. Artık bunun yerini USB portu almaya başlamıştır. Bazı işlemcilerde USB haberleşme özelliği varken, bazılarında yoktur ve sadece UART haberleşmesi vardır. Bu tür işlemcilerle çalışırken, bilgisayarla USB haberleşmesini sağlamak için ek olarak FTDI çipleri yada CH340 gibi UART – USB çeviriciler kullanılır..

STM32F103 mikrodenetleyicisinde Virtual Com Port bulunmaktadır. Virtual Com Port özelliği sayesinde UART-USB çeviricisi kullanmaya gerek kalmadan, bilgisayarınız mikrodenetleyicinizi USB’den tanır ve ona bir COM Portu atar. Siz artık bu COM Portu üstünden, bilgisayarınız ve mikrodenetleyiciniz arasında veri haberleşmesi yapabilirsiniz.

Örneğin MCU’nuzdan anlık sensör verileri alabilir veya C#’da bir arayüz yaparak; tasarladığınız cihazın USB üstünden konfigüre edilmesini sağlayabilirsiniz.

Ben bugün basitçe terminal ekranından MCU’ya değer göndermeyi ve MCU’dan terminal ekranına değer göndermeyi göstereceğim. Bu temeli aldıktan sonra geliştirmesi size kalmış.

Mikrodenetleyici olarak STM32F103 üstünden anlatım yapacağım. Fakat VCP özelliği olan başka STM serisi işlemcilerde de aynı prosedürleri uygulayarak sonuç elde edebilirsiniz. HAL Library‘den yararlanacağız.

1) CubeMX programını açarak, USB özelliğini aktif hale getirin.
Haberleşme basamaklarını takip edebilmemiz için PORTB.7 pinin GPIO_Output olarak ayarlayın.
ST-Link ile programlama yaptığımdan dolayı SWDIO ve SWCLK uçlarını da tanımladım.
Ayrıca VCP özelliğini kullanabilmeniz için harici osilatörü de aktif etmelisiniz. RCC bölümünden bunu ayarlayın.

Aşağıdaki resimde tüm basamakları görebilirsiniz.

1

2) Clock ayarlarını yapın.
Harici osilatörü kullanacağımız için HSE‘yi seçin.
Frekansı böleceğimiz için PLCLK‘yi seçin.
Daha sonra 72 MHz değerini girerek, diğer buslara oranlarına göre doğru değerleri girin.


Aşağıdaki resimde tüm basamakları görebilirsiniz.

2

3 Configuration sekmesine gelip, USB’ye tıklayın. Burada USB haberleşme veri uzunluğunu seçebilirsiniz.

STM32F103 için tek haberleşme hızı 12 Mbit olarak verilmiş. Başka ürünlerde başka seçeneklerde bulunabilir.

Biz sadece veri boyutumuzu seçeceğiz. 8 – 16 – 32 – 64 bit haberleşme seçenekleri var. Bizim için şuan 8i seçmek yeterlidir.

Resimden görebilirsiniz.

3

4) Ayarlarımız bitti. Kodunuzu generate edin.

5) Haberleşme için veri alma ve veri gönderme değişkenleri tanımlayalım.

4

6) Şimdi programın çalıştığını ve Init kısımlarının bittiğini, yani ayarların tamamlandığını görmek için PORTB.7’deki LED’imizi birkaç kez hızlıca yakıp söndürelim. Bu bize bir işarettir.

5

7) Proje ağacından usbd_cdc_if.c dosyasını açın. Bu dosya VCP’nin komutlarını içeren driver dosyasıdır.

6

8) Dosyayı biraz inceleyin. Receive ve transmit gibi bazı fonksiyonlar zaten göreceksiniz.

Eğer mikrodenetleyiciden bilgisayara veri göndermek istiyorsak, CDC_Transmit_FS fonksiyonunu kullanmalıyız.

7

Gördüğünüz üzere burada fonksiyon bazı parametreler istiyor.

CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)

Burada komutun nasıl düzenleneceğini anlatacağım. Bu düzenlemeyi bir notepad dosyasında yapın. Driver dosyası üzerinde değişiklik yapmayın.

uint8_t* Buf = Programın başında al ve ver isminde dizi değişkenler tanımlamıştık. Burası gönderilecek veriyi taşıyan değişkendir. yani buraya gonder değişkenini yazacağız.

uint16_t Len = Göndereceğiniz bilginin uzunluğudur. “Hello World\r\n” toplam 13 karakterlidir. O yüzden 13 yazıyoruz.

Komutumuz bu hale geldi.

CDC_Transmit_FS(gonder,13);

main.c dosyasına geri dönüp bu komutu aşağıda gösterildiği gibi yazın.

8

Şimdi ST-Link bağlantınızı kurup, programı STM32F103’e yükleyin. Yüklemeniz bitince ST-Linki tamamen STM32F103’den ayırın. Kartın diğer ucundaki USB portundan bilgisayara bağlantı yapın.

9

9) Bilgisayara bağladıktan bir süre sonra driver dosyaları yüklenir. Aygıt yöneticisini açın.

10

Bu şekilde aygıtı tanımış olmalıdır bilgisayar.

10) Putty yazılımı veya herhangi bir terminal yazılımı ile COM39 portunu dinlediğinizde şu görüntüyü elde etmelisiniz.

11

11) Şimdi bilgisayardan girilen bir verinin, STM32 tarafından okunuşuna bakalım.

7.adımda açtığımız driver dosyasına tekrar gelerek şu kısmı bulun.

12

USB’ye gelen verinin okunmasını 2 fonksiyon sağlıyor. Buradan bunu görebiliyoruz.

USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); // USB cihazından okunan verinin &Buf[0]’a aktarılacağını tanımlar.

USBD_CDC_ReceivePacket(&hUsbDeviceFS); // Veriyi USB’den alır ve tanımlanan Buf’a yazar.

Biz programın başında gönder ve al isimli diziler tanımlamıştık. Burada &Buf[0]’ın yerine al yazıyoruz.

Tabiki yine driver dosyasında değişiklik yapmıyoruz. 🙂

Şimdi main.c dosyamızı açalım ve az önce yazdığımız yerde düzenleme yapalım. Aşağıda gösterdim.

13

Yazılan komutlara göre USB’den veri okunacak ve okunan veri tekrar geri yazılacaktır. Böylece haberleşmenin sağlandığı görülecek.

Bu makalemi de burada noktalıyorum. Umarım sizin için faydalı ve anlaşılır olmuştur.
Soru ve öneriler için e-posta gönderebilirsiniz.

İyi çalışmalar dilerim.

Çağatay KAYNAK
Elektronik Mühendisi
cagataykaynak@gmail.com