СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №2/2012

функций для программирования об мена в микроконтроллере. Программы, предназначенные для компьютера, были написаны на языке Clarion v.6.0. Операторы этого языка очень похожи на операторы языка Бейсик, поэтому они могут быть по нятны даже новичку, а опытные про граммисты легко смогут перевести эти операторына тот язык, на котором они привыкли работать. Для программирования обмена по USB были использованышесть библи отечных функций: 1)функция открытия коммуникаций по USB и получения числового зна чения хандлера SI_Open(0,Handler). После её применения функция воз вращает своё значение, т.е. число, ко торому она равна. Кроме того, у этой функции два параметра. Первый па раметр необходимо задать (нулём), а второй (переменную Handler) – по лучить. Числовое значение перемен ной Handler, возвращаемое функци ей SI_Open(0,Handler), используется в другихфункциях, поэтому этойфунк цией должна предваряться вся про грамма.СамафункцияSI_Open(0,Hand ler) может принимать несколько значений, но главным является её ус пешное выполнение, при котором она принимает нулевое значение (SI_SUCCESS). Таким образом, строка loopwhile SI_Open(0,Handler) откры вает коммуникацию по USB и воз вращает значение; 2)функция закрытия коммуникаций по USB SI_Close(Handler). Работа этой функции похожа на первую, за исключением того, что в ней все го один параметр Handler, который требуется задать (равным полу ченному функцией SI_Open()). По сле окончания работы с USB этот интерфейс необходимо «закрыть» с помощью строки loop while SI_Close(Handler); 3)функциязаписипоUSBSI_Write(Hand ler,Buffer,NumBytesToWrite,NumBy tesWritten,0). При успешном выпол нении значение этой функции ну левое, а параметров у нее пять: ● Handler – параметр, о котором уже говорилось и который необходи мо задать; ● Buffer – параметр, являющийся на званием строки, которую необхо димо передать по USB, – этот пара метр необходимо задать; ● NumBytesToWrite – параметр, рав ный количеству байтов в передава емой строке, который нужно за дать; ● NumBytesWritten – параметр, рав ный количеству байтов, реально переданных по USB, который воз вращается функцией SI_Write() и который при необходимости мож но вывести на экран; ● 0 – пятый параметр. Например,если требуется передать по USB строку с названием STR, име ющую длину в 5 байт и значение STR=‘АБВГД’, то следующая запись выполнит это действие: loop while SI_Write(Handler,STR,5,NumBy tesWritten,0). После успешного вы полнения этой функции перемен ная NumBytesWritten будет равна ко личеству переданных байтов, т.е. 5; 4)функциячтенияпоUSBSI_Read(Hand ler,Buffer,NumBytesToRead,NumBy tesReturned,0). При успешном вы полнении значение этой функции также нулевое, и параметров у неё тоже пять: ● Handler – параметр, который необ ходимо задать; ● Buffer – параметр, являющийся на званием строки, в которуюнеобхо димо записать принятые по USB байты, – этот параметр следует за дать; ● NumBytesToRead – параметр, рав ный количеству байтов в принима емой строке, который требуется за дать; ● NumBytesReturned – параметр, рав ный количеству байтов, реально принятых по USB, который возвра щается функцией SI_Read() и кото рый при необходимости можно вывести на экран; ● 0 – пятый параметр. Если требуется принять 64 байтa ин формации по USB и записать эту информацию в строку с названием STR1, имеющую длину 64 байтa, то следующая запись выполнит это действие: loop while SI_Read(Hand ler,STR1,64,NumBytesReturned,0). После успешного выполнения этой функции, как описано в приложе нии AN169.pdf, переменная NumBy tesReturned будет равна количеству принятых байтов, т.е. 64, которые за пишутся в строку STR1. Однако это не всегда так, и при успешном вы полнении эта функция может воз вратить количество байт, не равное 64, а принятые байты не будут соот ветствовать переданным из микро контроллера. Дело в том, что приме нять функцию SI_Read() можно только удостоверившись в том, что эти 64 байтa действительно посту пили и готовы для чтения. Иначе можно получить непредсказуемый результат. Для проверки, что эти 64 байтa действительно поступили из USB и записались в строку STR1, служит другая функция, описание которой приведено ниже; 5)функцияпроверкиочередиприёмни ка SI_CheckRXQueue(Handler,NumBy tesInQueue,QueueStatus). При успеш ном выполнении значение этой функции также нулевое, а парамет ров у неё три: ● Handler – параметр, который необ ходимо задать; ● NumBytesInQueue – параметр, рав ный количеству реально получен ных по USB байтов; ● QueueStatus – параметр, который может принимать несколько значе ний, одно из которых, SI_RX_REA DY, означает, что принятые данные готовы для чтения. При объёме ОЗУ микроконтроллера менее 4 Кб можно вообще не исполь зовать переменную QueueStatus, а использовать переменную NumBy tesInQueue, равную количеству ре ально пришедших по USB байтов: loop until NumBytesInQueue=4096 loop while SI_CheckRXQueue(Hand ler,NumBytesInQueue,QueueStatus). Таким образом, чтобы передать в микроконтроллер по USB массив (строку) объёмом в 4 Кб и принять из МК по USB массив такого же объ ёма (и записать его в строку с име нем, предположим, SL1), требуется выполнить следующие три действия в виде трёх записей, разделённых между собой строками комментария (пунктир): ! loop while SI_Write(Handler,SL,4096,Num BytesWritten,0). ! loop until NumBytesInQueue=4096 loop while SI_CheckRXQueue(Han dler,NumBytesInQueue,QueueSta tus). ! loop while SI_Read(Handler,S1L,4096,Num BytesReturned,0). ! ПРАКТИЧЕСКАЯ ЭЛЕКТРОНИКА 40 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 2 2012 © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy