Вход

Просмотр полной версии : Com port выводит размазанные данные.



Sergeyi7
04.02.2021, 05:42
Хочу получить с контроллера на пк определённую информацию, использую библиотеку syslibcom. Информацию получить удалось но она неверная. Например отсылаю (_1234567890_), а получаю (_123451234_125...). Как отдавать информацию в верном порядке?


PROGRAM PLC_PRG

VAR
com_num: PORTS; (*Номер порта*)
Settings: COMSETTINGS; (*Параметры порта*)
COM_SERVICE1: COM_SERVICE; (*Блок открытия и настройки порта*)
com_ready: BOOL; (*Переменная, разрешающая обмены*)
i: INT;
port_open:DWORD;
str:STRING[255];
str_dword:DWORD;

END_VAR

(************************************************* ******
Открываем порт RS-485
************************************************** *****)

IF COM_SERVICE1.ready=FALSE THEN
(*
Номер порта (com_number):
0 - RS-485
1 - RS-232
4 - RS-232 DEBUG
*)
com_num:=0;
(*
Настройки порта (com_settings):
byParity - Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
byStopBits - Кол-во стоповых бит 0 =один, 1=полтора , 2=два
dwBaudRate - Скорость обмена 4800, 9600, 19200, 38400, 57600, 115200 бит/с.
dwBufferSize - Не используется должно быть =0
dwScan - Не используется должно быть =0
dwTimeout - Не используется должно быть =0
Port - Номер порта в формате перечисления PORTS (com_number)
*)
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=2;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
(*
Настройка и открытие порта (COM_SERVICE)
Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
Порт открывается с настройками, указанными в com_settings,
а на вход Task подаются следующие значения:

0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
1 - Изменение настроек уже открытого порта на настройки указанные в Settings
2 - Закрытие порта, номер порта берется из Settings.Port
*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
com_ready:=FALSE;
ELSE
COM_SERVICE1.Enable:=FALSE;
com_ready:=TRUE;
END_IF


IF com_ready=TRUE THEN
(*Порт открыт и инициализирован, теперь можно работать с портом*)
i:=i+1;
str:='_1234567890_';
str_dword:=SysComWrite(com_num,ADR(str), LEN(str), 0 );
END_IF

Sergeyi7
04.02.2021, 08:35
А как сделать одну отправку? Я с этим ещё не разобрался...

Sergeyi7
04.02.2021, 08:48
Мне удалось сделать одну отправку, и я настроил порт на пк чтобы данные принимались корректно и вроде сработало. Но меня настораживает что когда принимаю пакет непрерывно то первые несколько десятков принятых пакетов правильные, а потом снова идут некорректные, это нормально? Не будет потом сбоев в работе на обьекте? Буфер который будет оправляться, в контроллере будет чиститься и заполняться заново после загрузки его на пк.

Sergeyi7
04.02.2021, 14:23
По команде от пк который будет принимать буфер. Буфер скачается, будет возможно проверка и если всё в порядке буфер в контроллере сравняется нулю и заново заполнение буфера.

Sergeyi7
04.02.2021, 22:24
По команде с пк: Контроллер подключён к компьютеру и общаются они с помощью последовательного порта rs-485. Через командную строку cmd я либо читаю данные с контроллера либо посылаю данные на контроллер.
Сравняется нулю: Если скачанный буфер на компьютере будет такой же как на контроллере то буфер в контроллере очищается и заполняется заново.
Что если не всё в порядке: если скачанный буфер будет равен буферу на контроллере.
Извиняюсь за не внятное выражение.