Delphi => VB (BCC)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Delphi => VB (BCC)

Сообщение Scuder » 27.07.2005 (Ср) 19:24

Блин, столкнулся с нелепой задачей: нужно переписать, на мой взгляд, элементарный код с Дельфи (Паскаль) на VB. У меня не получилось. :-( Может, кто поможет?

Входящий параметр (PCommand):
Код: Выделить всё
Chr(2) & "AERF" & "ъ" & "01" & Chr(1) & "180702" & Chr(1) & "0935" & Chr(1) & Chr(3)


Паскаль:
Код: Выделить всё
const
  sSTOP = #$03;
  sDELIM = #$1C;

Procedure AddBCCToCommand : PChar);

Const StopStr : String[2] = sSTOP+#0;
Var BCC : Word;
  I : Word;
  S1 : String[5];

begin
  IF PCommand [StrLen(PCommand)-1] <> sDELIM then StrCat(PCommand, sDELIM);
  StrCat(PCommand, @StopStr[1]);
  BCC:=0;
  FOR I:=0 TO StrLen(PCommand)-1 DO Inc(BCC, Byte(PCommand[I]));
  S1:=HexW(BCC);
  S1:=S1[3]+S1[4]+S1[1]+S1[2]+#0;
  StrCat(PCommand, @S1[1]);
end;


BCC (Block Check Character) вычисляется как сумма без учёта переполнения всех байтов посылки и представляет собой 2-байтное число, передаваемое по формату битового поля.

Как реализовать на VB хотя бы этот цикл??

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.07.2005 (Чт) 6:55

Цикл:

Код: Выделить всё
for i=0 to len(PCommand)-1
BBC=BBC+CByte(Mid(PCommand,i,1))
next


функции HexW в Делфи нету, видать своя...
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.07.2005 (Чт) 7:16

Код: Выделить всё
S1:=HexW(BCC);
S1:=S1[3]+S1[4]+S1[1]+S1[2]+#0;

Мне непонятна здесь первая строчка - зачем она нужна, ведь значение S1 переписывается во второй?
Код: Выделить всё
Procedure AddBCCToCommand : PChar);

Лишняя скобка, должно быть так:
Код: Выделить всё
procedure AddBCCToCommand;


Ну а вообще это все должно выглядеть так:
Код: Выделить всё
dim sStop as string = chr(CByte("&H03"))
dim sDelim as string = chr(CByte("&H1C"))

sub AddBCCToCommand()
dim BCC as long, i as integer, s1 as string*5

if mid(PCommand,Len(PCommand)-1,1)<>sDelim then PCommand = PCommand + sDELIM
PCommand = PCommand + mid(StopStr,1,1)
for i=0 to len(PCommand)-1
BBC=BBC+CByte(Mid(PCommand,i,1))
next
s1=mid(s1,3,1)+mid(s1,4,1)+mid(s1,1,1)+mid(s1,2,1)+chr(0)
PCommand = PCommand + mid(s1,1,1)
end sub

Но это с поправкой на то, что мне неизвестна пара нюансов...
Последний раз редактировалось Twister 28.07.2005 (Чт) 7:26, всего редактировалось 1 раз.
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.07.2005 (Чт) 7:19

Код:
S1:=HexW(BCC);
S1:=S1[3]+S1[4]+S1[1]+S1[2]+#0;

Мне непонятна здесь первая строчка - зачем она нужна, ведь значение S1 переписывается во второй?

А, понял...

Тогда перед строчкой
Код: Выделить всё
s1=mid(s1,3,1)+mid(s1,4,1)+mid(s1,1,1)+mid(s1,2,1)+chr(0)
поставь
Код: Выделить всё
s1 = HexW(BCC)

Тогда получается:
Код: Выделить всё
dim sStop as string = chr(CByte("&H03"))
dim sDelim as string = chr(CByte("&H1C"))

sub AddBCCToCommand()
dim BCC as long, i as integer, s1 as string*5

if mid(PCommand,Len(PCommand)-1,1)<>sDelim then PCommand = PCommand + sDELIM
PCommand = PCommand + mid(StopStr,1,1)
for i=0 to len(PCommand)-1
  BBC=BBC+CByte(Mid(PCommand,i,1))
next
s1 = HexW(BCC)
s1=mid(s1,3,1)+mid(s1,4,1)+mid(s1,1,1)+mid(s1,2,1)+chr(0)
PCommand = PCommand + mid(s1,1,1)
end sub
А я все практикую лечение травами...

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 28.07.2005 (Чт) 18:26

Twister, спасибо за оказанное внимание. :-)

Я не знаю, как долго ты пишешь на VB, но запись типа
Код: Выделить всё
dim sStop as string = chr(CByte("&H03"))

в нём невозможна. :-)

Равно как и такое применение оператора Mid при указанных параметрах цикла:
Код: Выделить всё
for i=0 to len(PCommand)-1
  BBC=BBC+CByte(Mid(PCommand,i,1))
next


Дальше, функция CByte() не конвертирует тип String. Тут нужно использовать Asc().

Ну и насчёт HexW. В Паскале (в Дельфи, думаю, тоже) такая функция есть. Есть ещё и функция HexB. Обе они показывают значения в шестнадцатиричном представлении. Только первая для типа Word, а вторая - для Byte. В VB на этот случай есть функция Hex().

В общем, чё-то я затупил с самого начала. Рабочий код на VB выглядит так:

Код: Выделить всё
Dim PCommand As String
Dim BCC As Long
Dim i As Integer
Dim KC As String

'...

For i = 1 To Len(PCommand)
BCC = BCC + Asc(Mid$(PCommand, i, 1))
Next i

KC = Hex(BCC)
If Len(KC) = 3 Then KC = "0" & KC
KC = Mid$(KC, 3, 1) & Mid$(KC, 4, 1) & Mid$(KC, 1, 1) & Mid$(KC, 2, 1)

PCommand= PCommand+ KC

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 6:22

Код: Выделить всё
dim sStop as string = chr(CByte("&H03"))

Я понял что это неверно, но поздно и лезть обратно в форум лень было - дело в том что басик ЩАС не стоит.
:oops:
Код: Выделить всё
BBC=BBC+CByte(Mid(PCommand,i,1))

та же ерунда...
Ну и насчёт HexW. В Паскале (в Дельфи, думаю, тоже) такая функция есть

Специально смотрел хэлп - нет такой функции, по крайней мере в стандартных...

з.ы. Извиняюсь за то, что лажу прогнал... :oops:
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 113

    TopList