Главная » Bascom-8051, Basic, Железо » Преобразование строковых переменных BASCOM-8051

0

Строковые переменные могут преобразовываться в другие строковые переменные – длинные разбираться на части и, наоборот, из коротких строк могут складываться длинные. Bascom обеспечивает преобразование цифр, записанных в строковых переменных, в числа и  преобразование чисел в строковые переменные. Причем числа могут  быть  записаны  в  виде  десятичных  или  шестнадцатеричных  цифр  (символов).  В  следующей  таблице показано  расположение байтов строковой переменной в памяти после ее очистки (нулями). В первом  случае в переменную длиной N записано символами число «1234». Во втором случае на его  место  записано сообщение

«AF»

Расположение в памяти строковой переменной, определенной как: Dim S As String * N

Adr

Adr+1

Adr+2

Adr+3

Adr+4

Adr+N

Adr+N+1

30H

31H

32H

33H

00H

00H

00H

00H

41H

46H

00H

33H

00H

00H

00H

00H

Преобразование строк может выполняться в явном и неявном виде. Примеры явного преобразования:

а) разделение строк с помощью операторов MID(), LEFT(), RIGHT();

б) слияние суммированием строк ( “.. ” + “..”);

в) монтаж строк с помощью оператора MID();

г) преобразование строки в число с помощью функций VAL(), HEXVAL();

д) преобразование числа в строку с помощью функций STR(), HEX(), CHR().

Неявное  преобразование  строковых  переменных  происходит  при  вводе  (оператором  типа  INPUT)  и выводе (оператором PRINT)   цифровых переменных. Ниже дана  демонстрационная программа, показывающая основные способы преобразования строковых переменных. Подобные примеры имеются и в других программах,

приведенных выше.

‘——————————-

Dim R_rd As Integer             ‘код для ЦАП

Dim R_frq As Single             ‘частота для синтезатора

Dim R_lin As String * 6         ‘введенная строка Dim R_tmp As String * 20        ‘временная строка Mc:

Input "Input six characters" , R_lin

‘в R_lin принятая строка: “+XXXXX”, “-XXXXX”, “HXXXXX” или “R” R_tmp = Left(r_lin , 1)       ‘выделим первый символ для анализа

If R_tmp = "+" Then             ‘положительная полярность?

R_tmp = Mid(r_lin , 2 , 5)  ‘выделим только числовое значение

R_rd = Val(r_tmp)           ‘преобразовать в целое число

Goto Mc                     ‘строка обработана – в главный цикл

End If

If R_tmp = "-" Then             ‘отрицательная полярность?

R_rd = Val(r_lin)           ‘преобразуем строку с полярностью

Goto Mc                     ‘строка обработана – в главный цикл

End If

If R_tmp = "H" Then             ‘частота в Герцах?

R_tmp = Mid(r_lin , 2 , 5)  ‘выделим числовое значение

R_frq = Val(r_tmp)          ‘преобразовать в число с плав. точкой

R_frq = R_frq * 0.001       ‘преобразовать в килогерцы

Goto Mc                     ‘строка обработана – в главный цикл

End If

If R_tmp = "R" Then             ‘вернуть значения

Print "H" ; R_frq ; "D" ; R_rd ‘передадим строку состояния

‘или иначе

R_tmp = "H" + Str(r_frq) + "D" + Str(r_rd) ‘сформируем строку состояния

Print R_tmp                  ‘передадим готовую строку

Goto Mc                      ‘строка обработана – в главный цикл

End If

Goto Mc                         ‘в главный цикл

‘——————————-

В новой версии добавлено два новых оператора LCASE и UCASE, осуществляющих преобразование букв

строковых  переменных.  Первый  оператор  уменьшает  размер  букв  (делает  все  буквы  строчными),  а  второй наоборот, делает все буквы большими (прописными). Замечательно, что эти операторы не просто добавляют или

вычитают из кода символа число 20h, а выбирают символы, являющиеся латинскими буквами.  Таким образом цифры и другие служебные символы не преобразуются и остаются неизменными.

Еще одним важным добавление в версии 1.20 является функция INSTR(), с помощью  которой стало возможным  производить  поиск  значения  одной  строки  в  составе  другой  строки.  В  результате  работы  этой функции возвращается номер позиции, указывающий на начало искомого фрагмента. Если фрагмент не найден, то

возвращается нулевое значение. Практическая ценность этой функции заключается в  возможности  применения

сложных строк в протоколах обмена между процессорами, т.е. стало возможным применять команды переменного состава или производит накопление нескольких команд без обработки. Ниже дается  пример применения новых функций.

‘———————————————- ‘  демонстрация декодирования сложных команд

‘———————————————-

‘ программа запрашивает строку (командой "r", которая

‘ может содержать одну или несколько команд:

‘ Axx – установить параметр с двухзначным числом

‘ Bxxxx – установить параметр с четырехзначным числом

‘ Cxxxxxxxx – установить параметр с восьмизначным числом

‘ Например: "A12B1234C00123456", "A30", "c00004055" или "a05b0010" Dim P_a As Byte , P_b As Word , P_c As Long

Dim Tmp1 As Byte , Tmps As String * 10

Dim In_buf As String * 20

‘———————————————-

P_a = 0 : P_b = 0 : P_c = 0     ‘очистим переменые параметров

Do                              ‘цикл установки параметров

Input "r" , In_buf :        ‘приняли строку с командами

In_buf = Ucase(in_buf)      ‘переведем все символы в верхний регистр

‘проверим наличие первой команды

Tmps = "A" : Tmp1 = Instr(1 , In_buf , Tmps)

If Tmp1 <> 0 Then           ‘если она присутствует,

Tmps = Mid(in_buf , Tmp1 , 2)       ‘выберем числовое значение

P_a = Val(tmps)         ‘и преобразуем в число

End If

‘проверим наличие второй команды

Tmps = "B" : Tmp1 = Instr(1 , In_buf , Tmps)

If Tmp1 <> 0 Then           ‘если она присутствует, поступим аналогично

Tmps = Mid(in_buf , Tmp1 , 4) : P_b = Val(tmps)

End If

‘аналогично проверим наличие третьей команды

Tmps = "C" : Tmp1 = Instr(1 , In_buf , Tmps) If Tmp1 <> 0 Then

Tmps = Mid(in_buf , Tmp1 , 8) : P_c = Val(tmps)

End If

Wait 1                          ‘немного подождем и повторим

Loop

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии