Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с символом с кодом #0 [D6, Win2k]


shane54 ©   (2003-11-26 18:58:00) 

Уважаемые мастера.
Есть устройство, которое управляется командами на основе известной спецификации. При обращении через COM-порт каждая команда начинается с символа #2 и заканчивается символом #3. Т.е. сформировать команду не составляет никакого труда. Типа

команда := #3 + "блаблабла" + #3;

Теперь сама проблема.
При работе через TCP/IP спецификация говорит, что команду нужно начинать с символа #0. В этом то и вся беда - всё что после #0 идёт в строке - не воспринимается.
Т.е. например

ShowMessage(#0 + "Hello World")

покажет пустое окошко... (это для примера).

Что делать?


Rouse_   (2003-12-10 16:57:00) [1]

Блин... что так трудно, уже все примеры дали, неужели еще проще нужно?

var
Buf: Array [0..2] of Char;
begin
Buf[0] := #0;
Buf[1] := #3;
Buf[2] := #66;
ClientSocket1.Socket.SendBuf(Buf, Length(Buf));
end;


Андреев   (2003-12-10 16:43:00) [2]

Так всё-таки что надо использовать вместо
ClientSocket.Socket.SendText(#0+ #3 + #66);?

Кроме SendText я ничего подходящего в методах не увидел.


Reindeer Moss Eater   (2003-11-26 21:41:00) [3]

Из хранимой процедуры на PL/SQLвсё работает при использовании HexToRaw.

Да, для записи в сокет я использую компоненту ClientSocket. Метод ClientSocket.Socket.SendText(const S: string)

Мы вообще про что говорим?

Или в Java пакетах на оракле есть компонент ClientSocket ?


Юрий Зотов   (2003-11-26 20:01:00) [4]

> shane54 © (26.11.03 19:48) [15]

Скажите, Вы ответы вообще-то читаете?

Вам уже дважды дали простое, надежное и правильное решение - забудьте о строках, используйте байтовый массив и SendBuff.

В чем проблема - непонятно. Разве что в том, что Вы действительно не желаете вникать в ответы.


shane54   (2003-11-26 19:48:00) [5]

to Reindeer Moss Eater

на что указывает p^ ???

Из хранимой процедуры на PL/SQL всё работает при использовании HexToRaw.

Спецификация требует к сожалению... Скажу даже, что без этого #0 вообще ничего не работает. Устройство всё игнорирует.


Reindeer Moss Eater   (2003-11-26 19:27:00) [6]

Может глюк, но в Raw работает....

Что работает?
ShowMessage или спецификация?

Если спецификация, то требует ли она в действительности то что ты сказал :

При работе через TCP/IP спецификация говорит, что команду нужно начинать с символа #0.


Юрий Зотов   (2003-11-26 19:24:00) [7]

> shane54 © (26.11.03 19:13) [5]

> что делать с массивом
Разве SendBuff уже отменили?


Reindeer Moss Eater   (2003-11-26 19:23:00) [8]

var p:Pointer; pb:PByte;
begin
GetMem(p,1+Length("hello world"));
pb:=p;
pb^:=0;
Inc(pb);
StrPCopy(PChar(pb),"hello world");
ClientSocket1.Socket.SendBuf(p^,1+Length("hello world"));
end;


Reindeer Moss Eater   (2003-11-26 19:18:00) [9]

Что ты там используешь спецификацию мало волнует.
Дай ей нулевой байт и все тут.


shane54   (2003-11-26 19:18:00) [10]

Может глюк, но в Raw работает....


shane54   (2003-11-26 19:17:00) [11]

Да, для записи в сокет я использую компоненту ClientSocket. Метод ClientSocket.Socket.SendText(const S: string)


Reindeer Moss Eater   (2003-11-26 19:17:00) [12]

Причем здесь ХексТуРо, если спецификациятребует отправки нулевого байта?


shane54   (2003-11-26 19:15:00) [13]

На PL/SQL эта проблема решается функцией HexToRaw. Эта функция встроеная. Требуется только строку перевести самому в hex. Что делать в Паскале я честно говоря не знаю....


Reindeer Moss Eater   (2003-11-26 19:15:00) [14]

строки при том, что в сокет я пишу строку (команду).

А зачем строку, если это не строка?

GetMem + SendBuff(p^,len)


shane54   (2003-11-26 19:13:00) [15]

to Reindeer Moss Eate

Это для примера

to Юрий Зотов

строки при том, что в сокет я пишу строку (команду).
Что делать с массивом?


Юрий Зотов   (2003-11-26 19:05:00) [16]

Свершенно непонятно, при чем тут вообще строки?
Используйте array of byte и пишите туда любые коды.


clickmaker   (2003-11-26 19:03:00) [17]

StringReplace(S, #0, #32, [rfReplaceAll]) или в цикле


Reindeer Moss Eater   (2003-11-26 19:01:00) [18]

А зачем ShowMessage при передаче по TCP/IP ????


Юрий Федоров   (2003-11-26 19:01:00) [19]

почему не воспринимается
var S: string;
begin
s:=#0 + "Hello World";
SHowMessage(IntToStr(Length(s)));
увидим 12
Если под PChar типизировать то да


Наверх

Титульная страница Поиск, карта сайта Написать письмо