powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с com портом (запрос - ответ)
25 сообщений из 25, страница 1 из 1
Помогите с com портом (запрос - ответ)
    #39538790
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, доброго времени суток.

понадобилось получать вес с весов.
скачал comport411f

соединение красиво проходит.
Запросы на весы шлю (строка Sx1), но ответ словить не получается.

Код: sql
1.
ComPort.Write(Str[1], Length(Str)); // no defined type


в PortMon сразу же вижу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
35	0.00002738	Project1.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 5: Sx1..	
36	0.02828069	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
37	0.00000475	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
38	0.00000363	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 8:         	
39	0.00000196	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
40	0.00000447	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
41	0.00000223	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
42	0.00803454	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
43	0.00000419	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
44	0.00000363	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 8:  0 kg ..	


когда хочу прочитать
Код: sql
1.
ComPort.ReadStr(str, 8);


буфер вроде как пуст
Код: sql
1.
2.
49	0.00000531	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 0: 	
50	0.00000279	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS	



вроде как задача несложная, но опыта совсем нет в данной сфере
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538814
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReadStr наверное ждет перевода коретки. Читай по символу и складывай в строку сам.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538843
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Sx1 шлю с CR LF
в ReadStr, как мне кажется, данные в str только пишутся...
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538866
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkr, возможно поможет это
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538876
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrв ReadStr, как мне кажется, данные в str только пишутся...
Ничего не понял. Посмотри в код ReadStr. Окончание не просто так Str. Там должно быть ожидание окончания строки и кассовый аппарат об этом не знает.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538950
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom,

тогда подскажите логику работы с CreateFile...
по примерам - создали и читаем-читаем-читаем, а в какой момент записать запрос и проанализировать ответ?
либо создали, записали запрос, до каких пор читаем?
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538961
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrдо каких пор читаем?

Обычно до конца строки если в спецификациях протокола конкретного девайса не указано иное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39538996
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkr,

Чиатем либо до маркера окончания передачи либо до истечения таймаута.
Вот пример синхронного общения "запрос-ответ". Для TComPort/

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TCommComPort.Exchange(const DevID: WideString; InBuf: PByteArray; InSize: integer;
  OutBuf: PByteArray; var OutSize: integer);
var
  Buf: byte;
  EstSize: integer;

begin
  
  PortSemaphore.Acquire;
  EstSize:=OutSize;
  try
    fPort.ClearBuffer(true, true);
    fPort.Write(InBuf^,InSize);
    OutSize:=0;
    while (fPort.Read(buf,1)>0)do
    begin
      if OutSize<EstSize then
        OutBuf^[OutSize]:=Buf;
      inc(OutSize);
    end;
  finally
   PortSemaphore.Release;
  end;
end;
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539025
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkrтогда подскажите логику работы с CreateFile...
Лучше обратиться напрямую к YuRock. От себя могу порекомендовать Тынц и
https://ru.wikibooks.org/wiki/COM-порт_в_Windows_(программирование)
с COM-портом работал очень давно и с очень специфической железкой
Обычно с весами идет документация (ссылка на сайт) где расписан протокол обмена данными с устройством, драйвер и примеры использования
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539088
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrкогда хочу прочитать
Код: sql
1.
ComPort.ReadStr(str, 8);


буфер вроде как пуст
И когда же хочется читать?
Сразу после записи?
В пакете есть TComDataPacket, бери его, линкуй с компонентом порта, настраивай маркер конца строки и линкуй с евентом OnPacket.
Символы маркера конца строки ищи в документашке на весы.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539186
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoommkrтогда подскажите логику работы с CreateFile...
Лучше обратиться напрямую к YuRock.
Он автор CreateFile?
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539190
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanFreedoomпропущено...

Лучше обратиться напрямую к YuRock.
Он автор CreateFile?
Ого, ничё себе меня пиарят))
Нет, ко мне обращаться не надо, я в той теме всё что надо описал в этом сообщении: 20390991
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539318
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
mkr, обрабатывай событие OnRXChar и читай из порта внутри обработчика.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539661
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашлись пару процедурок:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
function OpenCOMPort: Boolean;
var
  DeviceName: array[0..80] of Char;
  ComFile: THandle;
begin
   { First step is to open the communications device for read/write.
     This is achieved using the Win32 'CreateFile' function.
     If it fails, the function returns false.    
   }

  StrPCopy(DeviceName, 'COM1:');

  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;
end;


function SetupCOMPort: Boolean;
const
  RxBufferSize = 256;
  TxBufferSize = 256;

var
  DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
   { We assume that the setup to configure the setup works fine.
     Otherwise the function returns false.   
   }

  Result := True;

  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

  // define the baudrate, parity,...

   
  Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;

{
  The following is an example of using the 'WriteFile' function
  to write data to the serial port.
}

procedure SendText(s: string);
var
  BytesWritten: DWORD;
begin
   { Add a word-wrap (#13 + #10) to the string   }

  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;

{
  The following is an example of using the 'ReadFile' function to read
  data from the serial port.
}

function ReadText: string;
var
  d: array[1..80] of Char;
  s: string;
  BytesRead, i: cardinal;
begin
  Result := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
  begin
    { Raise an exception }
  end;
  s := '';
  for i := 1 to BytesRead do s := s + d[I];
  Result := s;
end;


procedure CloseCOMPort;
begin
  // finally close the COM Port! 
  CloseHandle(ComFile);
end;



ну а потом

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm1.Button6Click(Sender: TObject);
begin
  OpenCOMPort;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  SendText(Edit1.Text)
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  memo4.Text := ReadText;
end;


и всё чудно работает)
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539665
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

  // define the baudrate, parity,...

   
  Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;




mkrи всё чудно работает)

Exit'ы не надо, не, в случае Result := False?
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539670
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
SetupCOMPort пока вообще не понадобилась)
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539675
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrSetupCOMPort пока вообще не понадобилась)
Понятно.

mkr
Код: pascal
1.
2.
3.
4.
  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;


Можно экономить место на диске, если писать вместо такого
Код: pascal
1.
  Result := ComFile <> INVALID_HANDLE_VALUE;
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539685
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда и в SetupCOMPort:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin
  Result := SetupComm(ComFile, RxBufferSize, TxBufferSize) and GetCommState(ComFile, DCB);

  Config := 'baud=9600 parity=n data=8 stop=1';

  Result := Result and (BuildCommDCB(@Config[1], DCB) and SetCommState(ComFile, DCB));

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;
  end;

  Result := Result and SetCommTimeouts(ComFile, CommTimeouts);
end;
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39539883
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkr,

В принципе, работа с COM-портом описана во многих статьях, например на сайте Delphikingdom.ru: http://www.delphikingdom.ru/asp/itemq.asp?Mode=1&ItemID=151
Пара комментов:
1) таймауты можно подстроить под себя, под конкретный протокол и конкретные обстоятельства. У вас, например, если от устройства ничего не придет, то функция будет ждать секунду (1000 мсек), а потом возвратит результат. Если это происходит в основном потоке, то секунду программа будет "висеть", не реагируя на мышку и нажатия клавиш.
2) 'baud=9600 parity=n data=8 stop=1' - это можно выставлять и через запись (структуру) DCB

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    GetCommState(ComFile, DCB); //тут тоже надо бы проверить результат
    with DCB do
    begin
      BaudRate := 9600;
      ByteSize := 8;
      Parity := NOPARITY;
      StopBits := ONESTOPBIT;
    end;
    if not SetCommState(ComFile, DCB)
    then ...
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39540230
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
спасибо, пока этот механизм внедрим, дальше купим сканер штрихкодов, будем дальше экспериментировать
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39541470
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkr,
настройки порта родной программы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
45	0.00004386	Komunikacja.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
46	0.00000251	Komunikacja.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 1024 OutSize: 1024	
47	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
48	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
49	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
50	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
51	0.00000838	Komunikacja.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
52	0.00000391	Komunikacja.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
53	0.00000419	Komunikacja.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
54	0.00000279	Komunikacja.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
55	0.00000140	Komunikacja.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:88 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
56	0.00000307	Komunikacja.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:256 XoffLimit:256	
57	0.00000140	Komunikacja.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:-1 RM:0 RC:0 WM:100 WC:1000	
58	0.00000363	Komunikacja.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL 



Моя настройка порта:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
21	0.00004833	erp_stock.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
22	0.00000251	erp_stock.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 1024 OutSize: 1024	
23	0.00000196	erp_stock.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
24	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
25	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
26	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
27	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
28	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
29	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
30	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
31	0.00000810	erp_stock.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
32	0.00000391	erp_stock.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
33	0.00000419	erp_stock.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
34	0.00000279	erp_stock.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
35	0.00000168	erp_stock.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:88 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
36	0.00000307	erp_stock.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:256 XoffLimit:256	
37	0.00000223	erp_stock.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL 	
38	0.00000140	erp_stock.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:0 RM:0 RC:1000 WM:100 WC:1000




непонятно, как задать RI:-1, если ReadIntervalTimeout: DWORD;
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39541479
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msdn в помощь:

https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa363190(v=vs.85).aspx

A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies that the read operation is to return immediately with the bytes that have already been received, even if no bytes have been received.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39541588
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrmkr,
непонятно, как задать RI:-1, если ReadIntervalTimeout: DWORD;makhaon написал, а вообще вам совсем не обязательно задавать такие же параметры таймаутов, как в оригинальной программе.
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39542820
VitalijX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mkr,
Описание протокола или название весового терминала укажите.
Вот как в некоторых весах Cas есть посылки #05 или #06 или #11 в весы.
А ответы могут начинаться #01 #02 а заканчиваться байтами #03 #04
...
Рейтинг: 0 / 0
Помогите с com портом (запрос - ответ)
    #39542821
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лично я, когда работал с железкой по COM-порту (причём по описанию, к компьютеру к этой железке подключенному меня не допускали) пользовался библиотекой Ararat Synapse

Она мне тогда больше понравилась, чем TComPort
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с com портом (запрос - ответ)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]