USB port bilan ishlashni dasturlash interfeysi. PIC kontrollerlarida USB interfeysidan amaliy foydalanish. TJvHidDevice sinfining asosiy xususiyatlari va hodisalari

Oxirgi darsda biz kontroller uchun proshivkani USB orqali ishlashi uchun yig'dik. Ammo kompyuter bilan ishlash uchun bizga kompyuterda ishlaydigan maxsus dastur ham kerak.

Endi biz uni yaratamiz.

Shunga qaramay, bizning kontrollerimiz uchun Microchip yechimlari to'plamida misol bor, lekin men uni o'zimcha qayta yozdim. Birinchidan, men buni grafik interfeysdan foydalanmasdan qildim va kod hajmi 3-4 baravar kamaydi. Qaysi biri o'qish uchun yaxshiroqdir. Biroq, ishlash printsipi bir xil. Mikrochipdagi standart misoldagi kod xuddi shu kabi ishlaydi.

Dastur C++ tilida yozilgan. Loyiha Visual C++ express 2010 ning talabalar uchun bepul versiyasida tuzilgan. Kod haqida umumiy fikr va mulohazalar beraman, lekin sizda C++ da dasturlash bo'yicha hech bo'lmaganda tajribangiz bor deb o'ylayman.

Shunday ekan, boshlaylik

Bu yerda butun loyiha, shu jumladan manba matn havolasi

USB port orqali ma'lumotlarni o'qish va yozish uchun biz qurilmamizga ko'rsatgich olishimiz kerak. Eski portlardan farqli o'laroq, ulangan yuzdan ortiq qurilmalar bo'lishi mumkinligi sababli, bu indeksni olish unchalik oson emas. Buni amalga oshirish uchun biz Windows drayverlariga, ya'ni SetupAPI ga murojaat qilamiz. Aytgancha, ko'rsatgichni olishimiz bilan biz USB port bilan xuddi fayl kabi aloqa qilamiz.
Ma'lumotlarni uzatish faqat bir nechta buyruqlarni oladi. Ammo bu erda tayyorgarlik!
Biz C++ tilida dasturlashayotganimiz uchun ma’lumotlar turlariga juda ehtiyot bo‘lishimiz kerak.
Win32 konsol loyihasini yarating. Va u erda yagona main.cpp faylini qo'shing

Shunday qilib, biz ba'zi kutubxonalarni kiritishimiz kerak.
#o'z ichiga oladi
#o'z ichiga oladi
#o'z ichiga oladi

Biz tashqi kutubxonani ham ulaymiz:
#pragma izohi (lib, "Setupapi.lib")

Dasturda tasvirlangan birinchi funksiya getUSBHandle(). Uning tavsifi kod izohlarida. Va umuman olganda, asosiy izohlar kodda berilgan. U qurilmamizni topish va qurilmadan yozishimiz va o'qishimiz uchun ko'rsatgichlarni tayyorlashga xizmat qiladi.
Xulosa qilib aytganda, u USB drayverlarga kirish uchun standart Windows funksiyalaridan foydalanadi va ular orqali qurilmaning o'ziga ko'rsatgich oladi.
Agar siz ushbu funktsiyalarning barchasi nima va qanday ishlashi bilan qiziqsangiz, MSDN yoki Agurovning mundarijadagi kitobiga murojaat qiling. Bilish kerak bo'lgan narsa: har bir qurilmaning yo'li bor va biz uni olishimiz muhim. Biz birinchi navbatda ID biz izlayotgan qurilmaga mos kelishini tekshiramiz. Va keyin biz qurilmaning yo'lini topamiz.Biz faqat HID sinfidagi qurilmalar orasida qidiramiz. bu Guid o'zgaruvchisida aniqlanadi. Qolganlari uchun dastur sharhlariga qarang.
Keyingi funktsiya - writeReadUSB. Bu faqat bizning qurilmamizga yozadigan yordamchi funksiya. Esda tutingki, qurilmaga ko‘rsatgich yaratgandan so‘ng yozish va o‘qish standart WriteFile va ReadFile buyruqlari yordamida amalga oshiriladi.
Va shundan so'ng biz dasturning bajarilishi boshlanadigan asosiy funktsiyani ko'ramiz. U getUSBHandle-ni qurilmaga ko'rsatgichni olguncha chaqiradi, keyin klaviaturadan buyruqni o'qiydi va unga qarab USB qurilmasidan ma'lumotlarni uzatadi va o'qiydi.
Yuqoridagi havoladagi loyiha sharhlar bilan manba kodini va tuzilgan dasturning o'zini o'z ichiga oladi. Omad.

Xato qidirayotib, hidapi kutubxonasiga duch keldim. Bu kross-platforma. Va faqat yashirin qurilmalar bilan ishlash uchun. Foydalanish juda oson. Men buning uchun loyiha keltiraman. havola.
Hidapi rasmiy veb-saytidan yuklab olingan. Loyihani boshlash uchun siz linkerga setupapi.lib ni qo'shishingiz kerak. loyiha->properties->linker->kiritish va u erda setupapi.lib imzo;
Omad.
Bu yerda kutubxonaning munosib tavsifini topdim: http://microsin.net/programming/PC/multi-platform-hid-api.html.
Rahmat!

Yuqorida aytib o'tilganidek, Windows operatsion tizimlari USB shinasiga ulangan qurilmalarning ishlashi uchun dasturiy ta'minotni ta'minlaydi. USB qurilmasi ma'lumotlar oqimlarini operatsion tizim darajasida qayta ishlash barcha USB qurilmalarini boshqarish va ular bilan tizim o'rtasida ma'lumot almashishning asosiy funktsiyalarini bajaradigan standart drayverlar to'plami tomonidan amalga oshiriladi.

Agar siz USB qurilmasi uchun ma'lumotlarni qayta ishlash imkoniyatlarini kengaytiradigan dastur yozishingiz kerak bo'lsa, uchta mumkin bo'lgan yo'ldan birini tanlashingiz mumkin:

barcha kerakli boshqaruv va ma'lumotlar almashish funktsiyalarini ta'minlaydigan o'zingizning qurilma drayveringizni va foydalanuvchi rejimida ushbu drayver bilan o'zaro ta'sir qiladigan dasturni yozing. Bunday holda siz standart tizim drayverlaridan butunlay voz kechishingiz mumkin;

kerakli funksionallikni ta'minlaydigan, lekin tizim drayverlari ustidagi drayverlar stekida joylashgan filtr drayverini yozing. Shunday qilib, barcha standart qayta ishlash funktsiyalari tizim tomonidan o'rnatilgan USB drayverlari tomonidan amalga oshiriladi va qo'shimcha funktsiyalar foydalanuvchi dasturi o'zaro ta'sir qiladigan filtr drayvingiz tomonidan ta'minlanadi;

erkin taqsimlangan funksiya va drayverlar kutubxonalaridan foydalaning

USB qurilmasiga kirish uchun mi.

Aksariyat hollarda, agar qurilma juda aniq vazifani bajarsa, USB qurilmasiga dasturiy ta'minotga kirish talab qilinishi mumkin. Masalan, USB-ga asoslangan "elektron osiloskoplar" yoki ma'lumotlarni yig'ish tizimlari ishlab chiqilgan bo'lib, ular ishlash uchun qurilmaning o'ziga kirishni talab qiladi. Ushbu holatlarning ko'pchiligida siz deyarli barcha mashhur dasturlash muhitlarida ishlaydigan erkin taqsimlangan funktsiyalar kutubxonalaridan foydalanishingiz mumkin. Masalan, GNU homiyligida Windows va Linux operatsion tizimlarida ishlash uchun kerakli drayverlar va funksiyalar kutubxonalarini o'z ichiga olgan LibUsb deb nomlanuvchi dasturiy ta'minot ishlab chiqilgan. Ushbu funktsiya kutubxonalari juda mashhur bo'lib, standart funktsiyalar to'plamidan foydalangan holda qurilmangiz bilan o'zaro ta'sir qiladigan dasturlarni tezda ishlab chiqishga imkon beradi. Bu o'z qurilma drayverini yozish zaruratini yo'q qiladi, bu vaqtni sezilarli darajada tejaydi.

Bundan tashqari, ko'pchilik foydalanuvchilar haydovchilarni ishlab chiqish texnikasi bilan tanish emas,

Bu dasturlashning juda murakkab sohasi, shuning uchun bunday erkin tarqatiladigan dasturiy ta'minotning mavjudligi foydalanuvchilarning keng doirasiga bebaho yordam beradi. LibUsb loyihasi asosida Visual Basic .NET va C# .NET bilan ishlash uchun o'ramlar ishlab chiqilgan bo'lib, ulardan eng mashhuri LibUsbDotNet bo'lib, u ham bepul dasturiy ta'minot homiyligida ishlab chiqilgan. USB qurilmalarini dasturlashning aniq murakkabligiga qaramay, sanab o'tilgan dasturiy ta'minot bu vazifani shunchalik soddalashtiradiki, hatto yangi boshlanuvchilar ham buni qila oladi. Keling, USB qurilmalaringiz bilan ishlashning amaliy misollarini ko'rib chiqaylik va LibUsb dasturiy paketidan boshlaylik. Aytgancha, yuqoridagi dasturiy ta'minotni www.sourceforge.net saytidan yoki ko'plab takroriy saytlardan bepul yuklab olish mumkin.

LibUsb USB funksiya kutubxonalari bilan qanday ishlash mumkin? Kutubxona shunday qurilgan

USB qurilmasi bilan bog'liq asosiy operatsiyalarni bajarishingiz uchun:

identifikatsiya yoki boshqacha aytganda, sanab o'tish. Ushbu operatsiyani bajarishda USB shinasiga ulangan qurilmalar aniqlanadi, bu libusb kutubxonasining tegishli funktsiyalari yordamida amalga oshiriladi;

kutubxona bir qator funktsiyalarga ega bo'lgan qurilma parametrlarini (qurilma identifikatorlari, ishlab chiqaruvchi va qurilma xususiyatlari haqidagi ma'lumotlarni) olish;

ma'lumotlarni ochish, yopish, o'qish va yozish, buyruqlar yuborish. USB qurilmasiga, boshqa fayl tizimi ob'ektlari kabi, tegishli kutubxona funktsiyalari yordamida amalga oshiriladigan yozish-o'qishga kirish mumkin.

Yuqoridagi barcha funksiyalarni tegishli libusb kutubxonasi funksiyalarini chaqirish orqali amalga oshirish mumkin, lekin ular bu yerda roʻyxatga kiritilmaydi, chunki bu juda koʻp joy egallaydi; biz ushbu xususiyatlardan qanday foydalanishni ko'rib chiqamiz

Guruch. 6.10

libusb0.sys drayverining qurilma drayverlari stekidagi joylashuvi

amaliy misollar yordamida. O'quvchilar barcha funktsiyalarning tavsifini tegishli hujjatlarda topishlari mumkin. Eslatib o‘tamiz, biz Windows operatsion tizimlarida libusb kutubxona funksiyalaridan foydalanishni ko‘rib chiqyapmiz.

Windows operatsion tizimida libusb bilan tarqatishni o'rnatishda tizimda libusb0.sys filtr drayveri o'rnatiladi. Ushbu drayver tizim drayverlari to'plamining yuqori qismida joylashgan bo'lib, uni, masalan, har qanday USB qurilmasi uchun drayver ma'lumotlariga qarab ko'rish oson (6.10-rasm).

Bundan tashqari, foydalanuvchi dasturlaridan drayverga kirish uchun tizimda libusb0.dll kutubxonasi o'rnatilgan bo'lib, uning yordamida siz foydalanuvchi dasturlarini ishlab chiqishingiz mumkin.

Guruch. 6.17

O'chirish paytida dastur oynasining ko'rinishi

Tizimdan USB qurilmalari

Minimaldan boshlaylik:
o'z ichiga 18f2455 -- ishlatilgan MK uchun kutubxona
--
enable_digital_io() -- barcha kirishlarni raqamli rejimga o'tkazish
--
taxallus Tugma hisoblanadi pin_B7 -- bizda tugma ulanganligi sababli, uni e'lon qilaylik
pin_B7_direction = kiritish -- bizning tugma kirish uchun ishlaydi
--
-- bir qator - va bizda USB CDC bilan ishlash uchun kerak bo'lgan hamma narsa mavjud
usb_serialni o'z ichiga oladi -- usb bilan ishlash uchun kutubxona
--
usb_serial_init() -- --USB CDC-ni ishga tushiring
abadiy tsikl-- doimiy ravishda bajariladigan asosiy tsikl
usb_serial_flush() -- usb yangilanishi. Ushbu protsedura barcha kerakli ishlarni bajaradi
-- shaxsiy kompyuter bilan aloqani saqlab qolish uchun harakatlar
yakuniy tsikl

Ushbu kodni kompilyatsiya qilish, natijada olingan HEX faylini bootloader yordamida MK ga yozish va qurilmani ishga tushirish orqali siz tizimda yangi qurilma qanday aniqlanganligini kuzatishingiz mumkin: Virtual com port.

Endi qurilma allaqachon ishlayotgan bo'lsa, keling, uni muloqot qilishni o'rgatamiz.

Qabul qilingan baytni o'qish uchun funktsiya mavjud usb_serial_read( bayt ) : mantiqiy. Qabul qilingan bayt bo'lsa, uni belgilangan o'zgaruvchida saqlaydi va qaytaradi rost, aks holda qaytadi yolg'on.

Baytni yuborish tartibi mavjud usb_serial_data. U o'zgaruvchi sifatida yashiringan, shuning uchun baytni yuborish uchun unga yuborilayotgan bayt qiymatini belgilash kifoya.

Keling, asosiy sikl oldidan bayt o'lchamli o'zgaruvchini e'lon qilaylik, asosiy siklda biz qabul qilingan baytlar mavjudligini tekshiramiz va agar ular mavjud bo'lsa, ularni qaytarib yuboramiz.

18f2455 ni o'z ichiga oladi
--
enable_digital_io()
--
taxallus Tugma hisoblanadi pin_B7
pin_B7_direction = kiritish
--
--
usb_serialni o'z ichiga oladi
--
usb_serial_init()
var bayt ch -- o'zgaruvchini e'lon qilish
abadiy tsikl-- asosiy halqa
usb_serial_flush()
agar(usb_serial_read(ch)) keyin-- agar bayt olinsa, u ch ga yoziladi
usb_serial_data = ch -- qabul qilingan baytni qaytarib yuboring
agar tugaydi
yakuniy halqa

Biz kompilyatsiya qilamiz, tugmani bosib ushlab turamiz, quvvat manbaini o'zgartiramiz, yuklash moslamasini ishga tushiramiz, proshivkani o'zgartiramiz, ishga tushiramiz.
Qurilma yana tizimda aniqlandi, endi qurilmaning ishlashini tekshirish uchun dastur kerak.

O'zimizniki bo'lmasa-da, biz tayyor terminaldan foydalanamiz: men RealTerm dasturidan foydalandim.
Portni kerakli raqam bilan oching va ma'lumotlarni yuboring.


Va biz yuborgan narsamizni qaytarib olamiz. Bu shuni anglatadiki, hamma narsa kerakli darajada ishlaydi.

Dasturiy ta'minot

Shunday qilib, bizning mikrokontroller baytlarni qabul qilishi va ularni darhol qaytarib yuborishi mumkin. Endi u bilan bog'lanish uchun o'z dasturimizni yozamiz (men Delphi dan foydalanaman).

Biz yangi loyiha yaratamiz, kerakli komponentlarni shaklga muvofiq tartibga solamiz:
SpinEdit1 - port raqamini ko'rsatish uchun
Tugma 1 - ulanish o'rnatish uchun
Tugma 2 - o'chirish uchun
SpinEdit2 - baytlarni kasrli shaklda kiritish uchun
Tugma 3 - bayt yuborish uchun
Memo1 - qabul qilingan ma'lumotlarni ko'rsatish uchun.

Yuqorida aytib o'tilganidek, siz oddiy matnli fayl bilan bir xil tarzda com port bilan ishlashingiz kerak: CreateFile, WriteFile va ReadFile funksiyalaridan foydalanish.

Tafsilotlarga kirmasdan, com port bilan ishlash uchun tayyor kutubxonani olaylik: ComPort.

Biz har bir tugmachaga kerakli vazifani biriktiramiz va yakuniy kodni olamiz:

birlik 1;

interfeys

Foydalanadi
Windows, Xabarlar, SysUtils, Variantlar, Sinflar, Grafika, Boshqaruv elementlari, Shakllar,
Dialoglar, StdCtrls, Spin, ComPort;

Turi
TForm1 = sinf (TForm)
SpinEdit1: TSpinEdit;
1-tugma: TB tugmasi;
2-tugma: TB tugmasi;
SpinEdit2: TSpinEdit;
3-tugma: TB tugmasi;
Memo1: TMemo;
protsedura OnRead(Sender: TObject; ReadBytes: massiv bayt );
protsedura Button1Click(Sender: TObject);
protsedura Button2Click(Sender: TObject);
protsedura FormDestroy(Yuborish: TObject);
protsedura Button3Click(Sender: TObject);
xususiy
(Shaxsiy deklaratsiyalar)
Port: TComPort;
ommaviy
(Ommaviy deklaratsiyalar)
oxiri;

var
Form1: TForm1;
son:integer;
amalga oshirish

Protsedura TForm1.Button1Click(Sender: TObject);
boshlanishi
Port:= TComPort.Create(SpinEdit1.Value, br115200); // ulanish yaratish
Port.OnRead:= OnRead; //qabul qilingan ma'lumotlarni o'qish uchun oqim yaratish
Button2.Enabled:= true ; //ulanishni yopish uchun tugmani faollashtiring
oxiri;

Protsedura TForm1.Button2Click(Sender: TObject);
boshlanishi
Port.Free; // ulanishni yoping
Button2.Enabled:= false ; //tugmani o'chirish
oxiri;

Protsedura TForm1.Button3Click(Sender: TObject);
boshlanishi
agar Button2.Enabled keyin Port.Write();
oxiri;

Protsedura TForm1.FormDestroy(Sender: TObject);
boshlanishi
agar Button2.Enabled keyin
Port.Free;
oxiri;

Protsedura TForm1.OnRead(Sender: TObject; ReadBytes: massiv bayt );
var
i:integer;
boshlanishi
i uchun:= Past(ReadBytes) dan Yuqori (ReadBytes) uchun //qabul qilingan baytlar massividan o'tish
boshlanishi
Memo1.Text:= Memo1.Text + "." +InttoHex(ReadBytes[i],2); //oynaga uning HEX qiymatini qo'shing
inc(son); //qabul qilingan baytlar sonini hisoblash
oxiri;
agar raqam > 10 bo'lsa, boshlang
Memo1.Lines.Add("" ); // chiziqni o'rash
son:= 0;
oxiri;
oxiri;

Biz ishga tushiramiz, ulanish o'rnatamiz, baytlarni yuboramiz:

Shunday qilib, bizning eng oddiy terminalimiz eng oddiy USB qurilmasi bilan ishlashga tayyor.

Ko'rib turganingizdek, o'qish va yozish dinamik bayt massivlarida sodir bo'ladi.

Qabul qilingan ma'lumotlarni qayta ishlash orqali siz joriy vazifaga mos keladigan zarur almashinuv protokolini yaratishingiz mumkin.

18f2455 ni o'z ichiga oladi
--
enable_digital_io()
--
taxallus Tugma hisoblanadi pin_B7
pin_B7_direction = kiritish
--
--
usb_serialni o'z ichiga oladi
--
usb_serial_init()
var bayt ch
var bayt i -- ikkinchi o'zgaruvchini e'lon qilish
abadiy tsikl-- asosiy halqa
usb_serial_flush()
agar(usb_serial_read(ch)) keyin-- bayt olingan bo'lsa, kerakli amallarni bajaring
hol ch of -- bayt raqami bo'ylab aylanish
0: usb_serial_data = 0xff
1: usb_serial_data = tugma -- yuborish tugmasi holati
BOSHQA blok-- boshqa narsa qabul qilingan bo'lsa
uchun 16 foydalanish i halqa-- 10 bayt ma'lumot yuborish
usb_serial_data = ch +i -- ch dan ch+15 gacha
yakuniy tsikl
oxirgi blok
yakuniy holat
agar tugaydi
yakuniy halqa

Qo'shimcha funktsiyalar

Agar biz shu erda to'xtaladigan bo'lsak, biz Internetda juda ko'p bo'lgan kutubxonadan foydalanish misolining batafsil tavsifi bilan muntazam maqola olamiz. Shuning uchun men biroz chuqurroq ma'lumot qo'shaman.

Ma'lumotlarni yuborishni osonlashtiradi

Bir vaqtning o'zida bir bayt ma'lumot yuborish har doim ham qulay emas. Kutubxona juda tez-tez yordam berishi mumkin chop etish. U barcha mumkin bo'lgan uzunlikdagi ma'lumotlarni barcha mumkin bo'lgan formatlarda yuborish protseduralarini o'z ichiga oladi: bayt, hex, dec, bin, boolean, bu dasturda ma'lumotlarni chiqarishni soddalashtirishi mumkin.
>chop etishni o'z ichiga oladi
...
var dword ma'lumotlar
print_dword_hex(usb_serial_ma'lumotlar, ma'lumotlar)

Barcha buyruqlar nomlarini kutubxona faylida topish mumkin.

Kompyuterga ulanish kutilmoqda

Agar mikrokontrollerning asosiy siklini boshlashdan oldin birinchi navbatda shaxsiy kompyuter bilan aloqa o'rnatish kerak bo'lsa, unda siz uning oldiga qatorlarni qo'shishingiz mumkin.
esa(usb_cdc_line_status() == 0x00) halqa
yakuniy halqa

Qurilmaga port raqamini belgilash

Agar siz hamma narsani avvalgidek qoldirsangiz, tizim har bir yangi ulanish uchun birinchi bepul port raqamini ajratadi. Bu shuni anglatadiki, siz uni doimo kuzatib borishingiz kerak bo'ladi.
Buning oldini olish uchun USB kutubxonasini ulashdan oldin qurilmaga noyob seriya raqamini belgilashingiz kerak:
Raqam har qanday uzunlikda bo'lishi va turli belgilarni o'z ichiga olishi mumkin.
const bayt USB_STRING3 =
{
24 , -- massiv uzunligi
0x03, -- bDescriptorType
"0" , 0x00,
"1" , 0x00,
"2" , 0x00,
"3" , 0x00,
"4" , 0x00,
"5" , 0x00,
"6" , 0x00,
"7" , 0x00,
"8" , 0x00,
"9" , 0x00,
"X", 0x00
}

Qurilma nomini o'zingizga o'zgartiring

Drayvlarni o'rnatishdan oldin tizimda ko'rinadigan qurilma nomini seriya raqami kabi nom bilan massivni e'lon qilish orqali o'zgartirishingiz mumkin; bu USB kutubxonasini ulashdan oldin bajarilishi kerak.
const bayt USB_STRING2 =
{
28 , --
0x03, -- bDescriptorType
"D", 0x00,
"e", 0x00,
"m", 0x00,
"o", 0x00,
" " , 0x00,
"B", 0x00,
"o", 0x00,
"a", 0x00,
"r", 0x00,
"d", 0x00,
" " , 0x00,
"=" , 0x00,
")" , 0x00
}

Afsuski, drayverlarni o'rnatgandan so'ng, qurilma o'z nomini .inf faylida ko'rsatilganiga o'zgartiradi, shuning uchun biz u erda ham nomni o'zgartiramiz.


DESCRIPTION="Demo CDC"

Qurilmaning avtomatik ulanishini tashkil qilamiz

Afsuski, bu vazifani bajarishning to'g'ridan-to'g'ri usullari yo'q, shuning uchun siz aqlli bo'lishingiz kerak.

Avvalo, yuzlab boshqa standart CDC mikrodasturlari orasida osongina aniqlash uchun qurilmangizga noyob ishlab chiqaruvchi va mahsulot qiymatini belgilashingiz kerak.
VID va PID pul uchun beriladi, shuning uchun keling, xitoyliklarning yo'lidan boraylik: jimgina ochiq-oydin bepul qiymatlarni oling.

Mikrodastur:
Mikrodasturda USB kutubxonasini ulashdan oldin ikkita o'zgaruvchini e'lon qilishingiz kerak

const so'z USB_SERIAL_PRODUCT_ID = 0xFF10
const so'z USB_SERIAL_VENDOR_ID = 0xFF10

FF10 o'rniga istalgan ikkita so'zni (2 bayt) kiritishingiz mumkin. Yakuniy natija biriktirilgan arxivda mavjud.

Haydovchilar:
Drayvlar VID va PID kombinatsiyasi uchun mo'ljallanmaganligi sababli, biz o'z qadriyatlarimizni .inf fayliga qo'lda qo'shamiz:


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10

Dasturiy ta'minot:
Qurilmaga ulanish/ajralish hodisalarini kuzatish uchun ComponentUSB kutubxonasini ulaymiz. Menimcha, har bir satrni tushuntirish kerak emas: barcha o'zgarishlarni biriktirilgan loyihada ko'rish mumkin.

Natija

Skrinshotda buni ko'rish qiyin, lekin yuborish tugmasi faqat ulangan qurilma mavjud bo'lganda faol bo'ladi va har 50 ms da dastur tugma holatini olish uchun so'rov yuboradi (ammo bu noto'g'ri, chunki tugmani bosish qayta ishlanishi kerak. MKda).

Ko'rib turganingizdek, USB orqali MK va shaxsiy kompyuter o'rtasida ma'lumotlar almashinuvini tashkil etish eng qiyin ish emas. Olingan ulanish nafaqat yakuniy maqsadlarda ishlatilishi mumkin: u dasturni tuzatish uchun ham mos keladi. Axir, hisoblash natijalarini va registrlar va o'zgaruvchilarning joriy holatini kompyuterga yuborish Morze alifbosida bir juft LEDni miltillashdan ko'ra ancha aniqroqdir.

Va nihoyat: Men sizga kayfiyat chiroqining manba kodiga qarashni maslahat beraman. U erda siz qulay almashinuv protokolini tashkil qilish uchun qabul qilingan ma'lumotlarni qayta ishlash uchun juda yaxshi variantni topishingiz mumkin.

USB port orqali dasturlash

SF-50 sun'iy yo'ldosh antennalarini USB port orqali sozlash uchun qurilmani dasturlash RS-232 porti orqali dasturlashdan faqat qurilmadan kompyuterga va kompyuterdan qurilmaga ma'lumotlarni uzatish usulida farq qiladi. USB orqali dasturlashda portativ USB drayv (flesh haydovchi) ishlatiladi. Bu, masalan, sizning kompyuteringiz yoki ko'pincha noutbuk (netbuk) shassisida ketma-ket RS-232 portiga ega bo'lmaganda qulaydir.
Qurilmani USB disk yordamida dasturlash uchun sizga kerak bo'ladi:
- FAT-32 fayl tizimida formatlangan USB disk (flesh-disk);
- OPENBOX SF-50 qurilmasining dasturiy ta'minot bo'limining Database_editor_new papkasida joylashgan AliEditor muharriri dasturi.

Dasturlashdan oldin ma'lumotlar bazasini qurilmadan kompyuteringizga o'tkazishingiz kerak. Buning uchun qurilmani yoqing va USB flesh-diskini USB portiga ulang. MENU-ni bajaring - Tizim - USB-ga saqlang,

Joriy kanal paydo bo'lguncha yoki hali kanallar bo'lmasa, asosiy menyu tasviri paydo bo'lguncha MENU tugmasini bosib menyudan chiqing va flesh-diskni olib tashlang. Fleshli drayverni kompyuterga joylashtiring.
Database_editor_new papkasidan Editor.exe dasturini ishga tushiring va undagi flesh-diskdagi tasvirni oching.

Ma'lumotlar bazasini tanlash so'ralganda, Foydalanuvchi ma'lumotlar bazasini tanlang.

OK tugmasini bosing. Barcha xizmatlarni tanlang, ma'lumotlar bazasida mavjud bo'lgan barcha skanerlangan va saqlangan televidenie, radio va xizmat ko'rsatish kanallari ro'yxati ochiladi.

Kanallarni xohlaganingizcha tahrirlang, masalan, faqat ochiq kanallarni qoldiring.
Kompyuteringiz klaviaturasida Shift tugmasini bosib ushlab turing, Pastga o'qni bosing va o'chirmoqchi bo'lgan kanallarni belgilang. Tanlanganni o'chirish uchun "O'chirish" tugmasini bosing.

Sun'iy yo'ldosh sozlamalarini tahrirlash uchun barcha xizmatlar - Sun'iy yo'ldosh haqida ma'lumot - EUTELSAT W4, W7 ni tanlang, ENTER tugmasini bosing.

Agar kerak bo'lsa, 1-antennadagi qiymatlarni tahrirlang.
Transponderni o'chirish uchun keraksizni tanlang va kompyuter klaviaturasidagi "O'chirish" tugmasini bosing, tanlangan amalni tasdiqlang.

Transponderni qo'shish uchun sun'iy yo'ldosh nomini bosing, sichqonchaning o'ng tugmachasini bosing va "Ma'lumot qo'shish" ni tanlang (yoki sun'iy yo'ldoshni ajratib ko'rsatish va klaviaturadagi Insert tugmasini bosing).

Yangi transponder uchun ma'lumotlarni kiriting, masalan, lyngsat.com veb-saytidan.

OK tugmasini bosing va transponder ro'yxatdan o'tganligiga ishonch hosil qiling.

Sun'iy yo'ldoshni qo'shish uchun Sun'iy yo'ldosh haqida ma'lumot qatoriga o'ting, klaviaturadagi Insert tugmasini bosing va yangi sun'iy yo'ldosh parametrlarini kiriting.

muharrir dasturini yoping va drayverni olib tashlang.
Drayvni OPENBOX SF-50 qurilmasiga joylashtiring, MENU - Tizim - USB dan yangilash ketma-ketligiga rioya qiling, "SAT & TP ro'yxati" rejimini tanlang.

Boshlash-ni tanlang. Niyatlaringizni tasdiqlang.

Qurilma ma'lumotlar bazasini yangilaydi va o'zini qayta ishga tushiradi. Qayta ishga tushirilgandan so'ng, menyu tilini rus tiliga yangi usulda o'rnatishingiz kerak bo'ladi. Qurilmani zavod parametrlariga qaytaring.
MENU tugmasini ikki marta bosib sozlamalar menyusidan chiqing. Joriy kanaldagi OK tugmasini bosing va kanallar ro'yxati tahrirlanganligiga ishonch hosil qiling.

Shuningdek, transponderlar va sun'iy yo'ldoshlar ro'yxati tahrirlanganligiga ishonch hosil qilishingiz mumkin.
Dasturlash tugallandi.

Ammo qurilmani kompyuterga jismonan ulash etarli emas, ular o'rtasida ma'lumotlar almashinuvini ham o'rnatishingiz kerak. Portni qanday tanlash va ulanishni tashkil qilish kerak? Bir necha yil oldin standart yechim MAQOMOTI portidan foydalanish edi. Aytgancha, turli mutaxassislar hali ham sanoat kompyuterlarida 8, 16 yoki hatto 32 COM portlarini o'rnatmoqdalar (ketma-ket portlar, kontrollerlar va boshqalar uchun turli xil PCI kengaytirish kartalarining butun toifasi mavjud). Shunday qilib, agar siz RS-232 interfeysi bilan bir nechta tashqi qurilmalarni ulashingiz kerak bo'lsa, eski an'anaga ko'ra, Rossiyaga bir necha hafta davomida kemada sayohat qiladigan qimmat adapterlar va ekzotik kengaytirish kartalari kerak bo'lishi mumkin. Aytgancha, oddiy adapterning nomi "DB9m / DB25f adapter" faqat kompyuter do'koni menejeri uchun tirnash xususiyati keltirishi mumkin.

HID qurilmasi nima

Hozirgi kunda deyarli barcha qurilmalar USB interfeysi orqali kompyuterga ulangan. Shuning uchun ko'pgina yangi shaxsiy kompyuterlarda MAQOMOTI porti umuman yo'q.

USB interfeysi yangi tashqi qurilmani kompyuter bilan ulash uchun standart yechim bo'lib, aniqrog'i bu USB 1.1 protokoliga asoslangan HID interfeysidir.

Ko'pchilik HID (inson interfeysi qurilmasi) interfeysi faqat klaviatura, sichqoncha va joystik uchun mo'ljallangan deb o'ylashsa-da, u tashqi qurilmalarni kompyuter bilan bog'lash bilan bog'liq ko'plab echimlar uchun javob beradi.

Agar foydalanuvchi past tezlikda (64 kbit / s gacha) ma'lumotlar almashinuvini amalga oshirishi kerak bo'lsa va shu bilan birga o'z drayverlarini zerikarli ishlab chiqish vaqtini qisqartirishni xohlasa, HID unga juda mos keladi. Yakuniy natija barcha keng tarqalgan dasturiy platformalarda kafolatlangan yordamga ega standart USB dasturiy interfeysiga asoslangan oddiy va mutlaqo zamonaviy yechim bo'ladi.

HID qurilmasi xususiyatlari

HID qurilmasi uchun dasturiy ta'minotni qo'llab-quvvatlashni tashkil qilish nuqtai nazaridan, hamma narsa juda jozibali ko'rinadi: Windows ostida ishlash uchun siz tayyor tasdiqlangan algoritmlarga asoslangan tushunarli, ixcham kodni tezda yaratishingiz mumkin. Shu bilan birga, ishlab chiquvchi o'zining yuqori darajadagi ma'lumotlar almashinuvi protokolini amalga oshirish uchun ko'p vaqtga ega bo'ladi, chunki zarur abstraktsiya darajasi allaqachon HID protokoli orqali tashkil etilgan (jadvalga qarang). Bundan tashqari, dasturchi uchun yozma almashinuv protokolini disk raskadrovka qilish oson (albatta, agar ishlaydigan HID qurilmasi mavjud bo'lsa) - protokolning o'zi nisbiy qat'iyligi tufayli, kompyuterni qo'llab-quvvatlash dasturini ishlab chiqish kifoya. qurilma. Hali ham bo'lardi! HID qurilmasini yaratuvchisi allaqachon ko'p ishlarni o'z zimmasiga oldi.

HID qurilmasi va kompyuter o'rtasida ma'lumotlar almashinuvini tashkil etish

HID qurilmasining kompyuter bilan o'zaro ta'sirini tavsiflash uchun biz "host" atamasidan foydalanamiz. Bunday holda, u USB protokoli orqali o'zaro ta'sirning umumiy jismoniy arxitekturasida boshqaruv qurilmasi sifatida tushuniladi. Shunday qilib, kompyuterdagi barcha portlar xost hisoblanadi. Xostga ega bo'lmagan turli xil USB qurilmalarini (flesh-disklar, sichqonlar, veb-kameralar, kameralar va boshqalar) ulashingiz mumkin. Xost qurilmani topish, ulanish, uzish, konfiguratsiya, shuningdek, statistik ma'lumotlarni yig'ish va energiya boshqaruvini ta'minlaydi.

HID qurilmasi yangi ma'lumotlar mavjudligini aniqlash uchun o'zining so'rov chastotasini o'rnatishi mumkin. Bu shuni anglatadiki, hatto bunday past darajada dasturchi tizimga ishonishi mumkin, chunki ovoz berish chastotasi va boshqa aloqa parametrlari HID qurilmasi boshqaruvchisi dasturida oldindan o'rnatilishi kerak. Bu HID protokolini USB 1.1 yoki USB 2.0 ning umumiy tavsifidan ajratib turadi, bu protokolni tashkil qilish uchun qat'iy talablarga ega emas. Biroq, yuqori darajadagi xavfsizlikni talab qiladigan aniq vazifalar uchun, deyarli bir xil ma'lumotlar bloklari doimiy ravishda uzatilganda, tsiklik so'rovdan xalos bo'lish juda qiyin bo'lishi mumkin.

HID qurilmani dasturlash xususiyatlari

HID qurilmalarida maxsus deskriptorlar mavjud. Xost qurilma HID sinfiga tegishli ekanligini aniqlaganida, u boshqaruvni tegishli drayverga o'tkazadi. Keyingi ma'lumotlar almashinuvi uning rahbarligida amalga oshiriladi, deb taxmin qilinadi.

Windows-da HidServ tizim xizmati HID qurilmalariga kirish uchun javobgardir. HID qurilmalariga so'rovlar funktsiyalari va HID drayveri bilan ishlashning boshqa xususiyatlari haqida batafsil ma'lumot P. V. Agurovning "USB interfeysi" ishida tasvirlangan. Foydalanish va dasturlash amaliyoti” (Sankt-Peterburg: BHV-Peterburg, 2005).

HID qurilmalarini "yuqori darajada" dasturlash

Paskalda ishlaydigan "ilova" dasturchilarining qiyin hayoti tasdiqlangan HID moduli tomonidan osonlashtiriladi. PAS, yashirin uchun qobiq dasturi. dll (Yashirin foydalanuvchi kutubxonasi - fayl xususiyatlarida ko'rsatilganidek). Faylga berilgan izohlar uning Microsoft kompaniyasining hidsdi.h va hidpi.h modullariga asoslanganligini ko'rsatadi. Va HID faylining o'zi. PAS JEDI() paketining bir qismidir.

Win32 uchun Delphi muhitida HID qurilmasi bilan ishlash uchun HID qurilmalariga kirish uchun qulay global boshqaruvchi bo'lgan TJvHidDeviceController komponenti ishlatiladi. Va allaqachon uning asosida siz ma'lum bir qurilma bilan ishlash uchun ob'ekt namunasini olishingiz mumkin.

TJvHidDeviceController komponentining asosiy xossalari va hodisalari

Keling, TJvHidDeviceController komponentini batafsil ko'rib chiqaylik. OnArrival hodisasi HID qurilmasi tizimga kirganida (ulanganda) ishga tushadi; qurilmaga kirish TJvHidDevice klassi namunasi orqali ushbu hodisaning ishlov beruvchisida taqdim etiladi. Oddiy OnDeviceChange hodisasi qurilma holatidagi o'zgarishlarga javob beradi, u faqat tizimdagi o'zgarishlar haqida signal beradi. OnDeviceData hodisasi HID qurilmalaridan biridan ma'lumotlar kelganda va ishlov beruvchiga quyidagilarni uzatganda ishga tushadi: HidDev: TJvHidDevice; - ma'lumotlar olingan qurilma;

OnDeviceDataError hodisasi HidDev parametrlarini qayta ishlash protsedurasiga o'tkazish orqali ma'lumotlarni uzatish xatosi haqida xabar beradi: TJvHidDevice; - HID qurilmasi va xato: DWORD; - xato kodi. OnDeviceUnplug hodisasi qurilma tizimda o'rnatilganlar ro'yxatidan o'chirilganligi haqida xabar beradi. Plug va Unplug-dagi hodisalarni qayta ishlash vositalarining turlari bir xil (manba matnda: TJvHidUnplugEvent = TJvHidPlugEvent). HID qurilmasiga mos keladigan TJvHidDevice sinfining ob'ekti ishlov beruvchiga uzatiladi.

Enumerate usulini chaqirish orqali tizimda mavjud bo'lgan HID qurilmalarini ketma-ket sanash uchun OnEnumerate hodisasi mo'ljallangan, ya'ni hodisalarni ishlov beruvchida topilgan qurilmalar ob'ektlar sifatida ketma-ket uzatiladi. Ushbu hodisa, masalan, xost (kompyuter) tashabbusi bilan HID qurilmalarining holatini qayta ko'rib chiqishda mavjud HID qurilmalarini ishlov beruvchi orqali "o'tkazish" uchun ishlatiladigan Enumerate usuli bilan majburlanadi.

OnRemoval hodisasi qurilma tizimdan jismonan olib tashlanganda va OnDeviceUnplug bilan bir xil ishlov beruvchi turi TJvHidUnplugEventga ega bo'lganda ishga tushadi. CountByProductName funksiyasi argumentda ko‘rsatilgan mahsulot nomiga mos keladigan qurilmalar sonini, CountByVendorName esa argumentda ko‘rsatilgan ishlab chiqaruvchi nomini qaytaradi.

TJvHidDevice sinfining asosiy xususiyatlari va hodisalari

TJvHidDevice klassi bitta HID qurilmasining virtual ko'rinishidir. Ushbu sinfning yangi ob'ektini, yuqorida aytib o'tilganidek, OnArrival yoki OnEnumerate hodisasidan olish mumkin. TJvHidDeviceController va TJvHidDevice sinflarining funksionalligi qisman takrorlanadi, chunki ularning birinchisi tizimda mavjud bo'lgan HID qurilmalari to'plami bilan ishlash uchun umumiy vositalarni va ulardan biriga kirish mexanizmini birlashtiradi. Qurilmani SerialNumber, ProductName va VendorName xususiyatlari bilan yagona aniqlash mumkin. Bunday ob'ekt yordamida ma'lumotlarning kelishi haqida ma'lumot olish uchun OnData hodisasidan foydalanishingiz mumkin. Ma'lumotlar WriteFile usuli orqali yuboriladi (qat'iy ma'noda - funktsiya orqali). WriteFile - WriteFile (kernel32) tizim funksiyasi atrofidagi o'ram.

Qurilmaning oʻchirilganligini nazorat qilish uchun OnUnplug hodisasiga oʻz ishlovchingizni belgilashingiz kerak. HID qurilmasi bilan ma'lumot almashishni boshlashdan oldin, HasReadWriteAccess yordamida bunday almashish mumkinligiga ishonch hosil qilishingiz kerak. Bu sinfda hatto ma'lumotlar almashinuvida xatolik yuz berganda alohida OnDataError hodisasi mavjud.

Endi standart bo'lmagan qurilma - HID-ga asoslangan plastik chip kartalari bilan ma'lumotlar almashinuvini tashkil qilish uchun test mijoz dasturini amalga oshiradigan "jonli" loyihaning kod qismlarini ko'rib chiqaylik. Realizm uchun kurashda muallif ro'yxatlardan "qo'shimcha" texnologik kod ulanishlarini chiqarib tashlamaslikni o'z zimmasiga oldi.

ScanDevices usuli (1-listing) tizimda kerakli HID qurilmasini qidirish jarayonini boshlash uchun mo'ljallangan. Kodning ko'p qismi, Enumerate usuliga qo'ng'iroq qilishdan tashqari, ixtiyoriy va ilovaga moslashuvchanlikni ta'minlaydi, masalan, HID bo'lmagan interfeysda ishlash qobiliyatini bir xil sinov dasturiga qo'shish mumkin. AddError usuli dastur ishlayotgan vaqtda disk raskadrovka ma'lumotlarini oynada ko'rsatadi.

2-listda kerakli tashqi qurilmani topish uchun OnEnumerate hodisasi ishlov beruvchisi ko'rsatilgan. Oddiylik uchun dastur faqat kerakli turdagi bitta qurilma bilan ishlashi mumkin deb taxmin qilamiz.

Loyihani keyingi amalga oshirishni ko'rib chiqishdan oldin, biz qabul qilingan yuqori darajadagi ma'lumotlar almashinuvi formati, ya'ni ma'lumotlarni qabul qilish va uzatish usullari va hal qilinayotgan muayyan dastur muammosi o'rtasida vositachi bo'lish uchun mo'ljallangan tuzilma haqida bir oz gapirishimiz kerak. Gap shundaki, bu erda ishlab chiquvchiga o'zining ijodiy qobiliyatlarini amalga oshirish imkoniyati beriladi. To'g'rirog'i, ishlab chiquvchilar, chunki yangi protokolni yaratish jarayoni juda tez-tez ikki tomonlama bo'lib, birinchi skripkani almashish algoritmini amalga oshirish qiyinroq bo'lgan kishi o'ynaydi. Umuman olganda, almashinuv protokoli qanday bo'lishidan qat'i nazar, har bir dasturiy ta'minot ob'ektini imkon qadar vizual va o'zini o'zi ta'minlash, hatto ba'zi umumiy qabul qilingan an'analar hisobiga ham har doim yoqimli. Chunki eng yaxshi yechim dasturiy ta'minot muhitiga minimal ulanish va keyingi rivojlanish uchun katta imkoniyatlar bilan qisqa vaqt ichida amalga oshiriladigan yechimdir. Ushbu tamoyillar asosida yuqori darajadagi almashinuv protokoli yaratildi, bu erda asosiy tushuncha "buyruq". Ro'yxat 3 muallifning string ma'lumotlarini qanchalik yaxshi ko'rishini ko'rsatadi, bu esa dastur modullarini disk raskadrovka qilishda uni bir necha marta saqlab qolgan. Bizda hatto String turi ham borligi qanchalik ajoyib! Barcha protokol buyruqlari toifalarga (sinflarga) bo'linadi, ular ichida uning maqsadini o'ziga xos tarzda tavsiflovchi buyruq kodi mavjud. edParam parametri qurilmaga maʼlumotlarni yuborish uchun ishlatiladi va edAnswerData parametri qurilmadan olingan maʼlumotlarni oʻz ichiga oladi. Ta'riflangan yozuv a'zolarining satr turi sizga HEX string formatidagi ma'lumotlarni erkin va aniq manipulyatsiya qilish imkonini beradi. Va eng yaxshi tomoni shundaki, tasvirlangan yozuvning formati mafkuraviy jihatdan uning bevosita maqsadi va uni taqdim etishning turli shakllari (INI, HEX, XML va boshqalar) o'rtasida joylashgan.

Buyruqni bajarish, ya'ni qurilmaga ma'lumotlarni yuborish 8 bayt uzunlikdagi ma'lumotlar paketlarini yuborish yordamida amalga oshiriladi (Ro'yxat 4). Bu uzunlik yagona yechim emas; bu tanlov yuqori darajadagi protokol talablari bilan belgilanadi va har bir alohida holatda boshqacha bo'lishi mumkin. Bu, ular aytganidek, ta'm masalasidir. ExecuteCommand usulidagi g'alati IsUSBMode bayrog'i (Kompyuter dunyosida 5 ro'yxati) USB bilan ishlash o'rniga MAQOMOTI porti yoki boshqa interfeysdan foydalanishimiz kerakligini eslatish uchun qoldiriladi. Yuborilgan ma'lumotlar guruhining boshida tasodifiy tanlangan formatdagi sinxronlash seriyasi (masalan, 3E3E3E2B) qurilmaga uzatiladi, bu qurilmaga kirishda to'liq qonuniy ma'lumotlarga ega ekanligi haqida xabar beradi. Eslatib o'taman, bu holatda biz HID haqida emas, balki mafkuraviy jihatdan apparatdan ajratilgan va maxsus dastur muammolarini hal qilish uchun mo'ljallangan aniq yuqori darajadagi protokol haqida gapiramiz.

Qurilmadan olingan ma'lumotlar uchun GetDataExecutor ishlov beruvchisi (8 bayt paketi) dastlab qayta ishlangan ma'lumotlarni keyingi qayta ishlash uchun uzatish uchun maxsus yaratilgan OnNewInputData hodisasidan foydalanadi, bunda ularning eski va yangi qiymatlari ko'rsatilgan ("Kompyuter diski dunyosi" ning 6-ro'yxati. ”). Shunday qilib, xom ma'lumotlarning kelishi hodisalari va keyingi qayta ishlash ko'rsatkichlari ajratiladi, bu esa noto'g'ri, takroriy yoki keraksiz kirish ma'lumotlaridan ogohlantirish uchun ba'zi maxsus algoritmlarni erta qo'shish imkonini beradi.

Bu erda keltirilgan HID qurilmasi bilan ishlash misollari maqolaning umumiy g'oyasini - Delphi yordamida nostandart HID qurilmalarini dasturlashning nisbatan qulayligini ko'rsatadi.

Sizga maqola yoqdimi? Do'stlaringizga ulashing: