![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 03.08.2009
Сообщений: 6
|
![]()
Имею 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 этот байт не записывается! как быть? |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 28.03.2007
Сообщений: 1,814
|
![]()
Я так принимал:
Код:
Код:
Последний раз редактировалось SERG1980; 13.04.2011 в 09:11. |
![]() |
![]() |
![]() |
#3 | |
Регистрация: 03.08.2009
Сообщений: 6
|
![]() Цитата:
хотя... есть отличие. щас проверю |
|
![]() |
![]() |
![]() |
#4 |
Регистрация: 03.08.2009
Сообщений: 6
|
![]()
отлично. данные пошли. спасибо!
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
php, perl прием данных, чтобы сообщения доходили без перезагрузки страницы | Delphinchik | Perl | 1 | 16.02.2011 21:07 |
Прием и передача данных в PCI_E устройство | Andrei4 | Помощь студентам | 2 | 12.11.2010 18:33 |
Прием данных по DDE | chigik | Microsoft Office Excel | 3 | 13.05.2009 10:47 |
Система мониторинга: Отправка данных+Прием+Обработка+Просмотр | Руслан Сагитов | Помощь студентам | 4 | 13.10.2008 17:44 |