Поможет ли мне обновление прошивки ПЛК с 2.10 до 2.14?
Поможет ли мне обновление прошивки ПЛК с 2.10 до 2.14?
Так, заработало, но не так как ожидалось
Принимает нормально, в ответ подготавливаю на отправку байтовый массив
Вот кусок кода, ответственного за отправку
str := 'AT+CIPSEND=';
str := CONCAT(str, INT_TO_STRING(fulllength));
str := CONCAT(str, '$R');
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
g_sends_1 := cnt;
cnt := SysComWrite(aPort, ADR(outbuf), fulllength, 0);
g_sends_2 := cnt;
str := '$R';
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
g_sends_3 := cnt;
g_send_bytes_to_pc := g_sends_1 + g_sends_2 + g_sends_3; <-- для отладки
На сервере в ответ вместо ожидаемого байтового массива (как отправил в таком виде, так и должен получить)
получаю в ответ посылку другого содержания (раскодированного), она ниже
AT+CIPS
Что за фигня?
Короче, проблема с отправкой.
Еще раз подчеркну - этот код корректно работает для модема старой модификации, почему не работает для новой модели ПМ-02?
Переделал на
str := 'AT+CIPSEND$R';
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
cnt := SysComWrite(aPort, ADR(outbuf), fulllength, 0);
str := '$1A$R';
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
В ответ на сервере появляется
65
84
43
67
73
80
83
84
65
84
85
83
13
65
84
43
67
73
80
83
69
78
68
13
255 <-- Нужный мне пакет, начинающийся с 255
120
1
18
18
157
с начала полученного пакета (65) и до 255, если перевести в байты в ASCII - получится типа "AT+CIPSTUS AT+CIPS;ND"
Первое слово очень похоже на команду AT+CIPSTATUS, второе - AT+CIPSEND
Как же все таки убрать этих паразитов?
либо не весь код выкладываете, но если все так как описано, то не ждете ответов на посланные команды, возможно поэтому все в одну строку лепится
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
> capzap
>... то не ждете ответов на посланные команды, возможно поэтому все в одну строку лепится
Нет, не думаю.
Сегодня однозначно локализовал проблему
Проблема в отправке командой AT+CIPSEND= (передаю бинарные данные)
Общий синтаксис AT+CIPSEND=<Длина данных><Данные>
Поправил от лишнего код, в программе сделал только один ответ (квитирую подтверждение полученных данных с сервера).
Единственная команда, которая отправляется серверу.
cnt: DWORD;
_index: BYTE;
outbuf: ARRAY[0..254] OF BYTE;
....
str := 'AT+CIPSEND=6$R';
cnt := SysComWrite(0, ADR(str), LEN(str), 0);
outbuf[0] := 255;
outbuf[1] := 0;
outbuf[2] := 120;
outbuf[3] := 0;
outbuf[4] := _index;
outbuf[5] := outbuf[2] + outbuf[4];
cnt := SysComWrite(0, ADR(outbuf), 6, 0);
_index например 25
Все просто. В посылке явно задаем дину передаваемого массива данных, в нашем случае 6, затем отправляем сами данные.
Ставлю модем старой модели.
На сервере принимаю
255
0
120
0
25
145
То что нужно!
Меняю на модем ПМ-02
В ответ получаю
65
84
43
67
73
80 (AT+CIP)
Ну как же так?
Один и тот же код, один и тот же контроллер.
ЧЯДНТ??????
Последний раз редактировалось grayeddy; 02.02.2014 в 13:24.
ни чего такого, на что я намекал, Вы не сделали, отправляете одну команду SysComWrite, и не дождавшись ответа Ok или ERROR посылаете вторую, вот возможно и выталкиваете в инет весь накопленный буффер модема, а то что на старом модеме получается, так вроде не секрет что чипсеты разные и значит имеется какое то отличие, уж не знаю в размере буффера или во временных задержках
Как сделать паузу, чтобы программа начала выполнение с того места, где остановилась?
Аналог Delay?
Решил поставить паузу в 200 мс между AT+CIPSEND и отправкой данных
Сделал так
VAR
...
timerTP: TP;
...
str := 'AT+CIPSEND=6$R';
cnt := SysComWrite(0, ADR(str), LEN(str), 0);
(* ставим паузу *)
timerTP(IN := TRUE, PT := T#200ms);
IF timerTP.Q THEN
timerTP(IN := FALSE):
outbuf[0] := 255;
outbuf[1] := 0;
outbuf[2] := 120;
outbuf[3] := 0;
outbuf[4] := _index;
outbuf[5] := outbuf[2] + outbuf[4];
cnt := SysComWrite(0, ADR(outbuf), 6, 0);
END_IF
Похоже не работает.
3а 4 года забыл про таймеры на ST
Последний раз редактировалось grayeddy; 02.02.2014 в 16:32.
Кстати при первой записи проконтролируйте, сколько байт записалось,конечно не факт что это значение ушло в порт и всё же, может обнаружится какой прогресс почему слипаются команды
Уже прогресс. Когда ставлю брейк (breakpont) на местоположение таймера или выходного буфера (скажем на outbuf[0]) внутри END_IF , то все начинает работать как надо.
Просто жму далее F5 - и опа. все идет как надо.
Стоит снять брейк - не идет.
Третий раз тогда повторю, добавляйте в свой код прием ответа от модема и только после отправляйте следующую команду