Имею Delphi 10Lite
Имеется платка, которая подсоединяется к компу по усб, эмулируя ком порт. Работать с ней умею. есть офис с несколькими компами, объединенных в локалку. Есть приложение, которое может использоваться с данной платкой. Сейчас если кто-то хочет поработать должен брать плату и подсоединять к своему компу. Так она кочует с компа на комп. Нужно сделать так, чтобы она была подключена к какому либо компу. На этом компе запущен сервер, к которому будут подключаться другие через tcp и работать с железом.
сделал на Indy10
Вот рабочий кусок кода (он в сокращении выложен. оставлены только ключевые моменты):
клиент:
Код:
TcpCli:=TIdTCPClient.Create(nil);
TcpCli.Port:=3006;
TCPCli.ReadTimeout:=1000;
TCPCli.UseNagle:=false;
...
TCPCli.Host:=NOD;
TcpCli.Connect;
if not TcpCli.Connected then
begin
LOG.WriteString(' TcpCli not connected to server'+#13#10);
exit;
end;
...
try
TCPCli.IOHandler.WriteBufferOpen;
TCPCli.IOHandler.Write(FWrBuf); -шлю 1 байт
TCPCli.IOHandler.WriteBufferClose;
except
on E: EIdException do
begin
LOG.WriteString('WriteBuffer failed. exception: '+E.Message+#13#10);
Result:=false;
end
else
begin
LOG.WriteString('WriteBuffer failed. Fuck, Shit!'+#13#10);
Result:=false;
end;
end;
сервер
Код:
procedure TMainForm.IdTCPServerExecute(AConte xt: TIdContext);
var buf: array[0..100] of byte;
begin
try
with AContext.Connection do
begin
try
Dongle.FWrBuf.Clear;
try
IOHandler.ReadStream(Dongle.FWrBuf,1); принимаю 1 байт
except
end;
if Dongle.FWrBuf.Size>0 then
begin
//пишем данные в плату
if not Dongle.WriteBuffer then
exit;
end;
//читаем данные из платы
Dongle.FRdBuf.Clear;
Dongle.ReadBuffer;
if Dongle.FRdBuf.Size>0 then
begin
//отправляем ответ от платы клиентской программе
IOHandler.WriteBufferOpen;
IOHandler.Write(Dongle.FRdBuf);
IOHandler.WriteBufferClose;
exit;
end;
except
end;
end;
finally
end;
end;
Вот так все работает
Но нужно двигаться дальше. Отсылать серваку не 1 байт, а произвольное их количество
Для этого на сервере изменяю так:
Код:
with AContext.Connection do
begin
try
Dongle.FWrBuf.Clear;
IOHandler.ReadTimeout(50);
try
IOHandler.ReadStream(Dongle.FWrBuf);
except
end;
Админ: Пользуемся тегами для оформления кода!
ставлю на сервере usenagle=false
при этом IOHandler.ReadStream не зависает, но и не принимает никаких данных (от клиента все так же шлю пока 1 байт)
Кстати при использовании TIdLOGFile
у клиента:
Sent 12.04.2011 0:24:31:
у сервера:
Recv 12.04.2011 0:24:31:
там после двоеточия идет квадратик(типо неотображаемый символ я полагаю)
По сему на сервер данные поступают, но в поток Dongle.FWrBuf этот байт не записывается!
как быть?