не все версии прошивки sim800l корректно это отрабатывают (длительность DTMF) так что так себе идея.
Спасибо.
Я, кстати, обновила прошивку на
SIM800L24_BOOTLOADER_V005_MT6261_1418B05SIM800L24
const char at0cmdAT[] PROGMEM = "AT\r"; // проверка связи
А почему вы храните символ \r?
а почему нет? ![]()
команда для модема должна заканчиваться \r
gsm.print(cmd_buf);
можно же?
gsm.println(cmd_buf);
И ещё
char cmd_buf[max_size_cmd_buf]; // буфер команд
s800lib::clearRespBuf(); // очищаем приемный буфер
const char * addrStroki = pgm_read_word_near((int)(at_list_cmd + _current_cmd));
strcpy_P(cmd_buf, addrStroki);
Адрес команды, это тоже самое что по ссылке ниже?
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));
И ещё
Спойлер
if (s800lib::findResp(( char *) "CMGL:" , inByte))
Для чего указывать *(char)**CMGL
можно, но
1 привычка, поскольку не всегда командой print отправляю, можно же просто пробежаться по массиву char и отправить gsm.write(byte)
2 есть составные команды/длинные, после отправки которых еще куча данных отправить и только потом \r. Т е чтоб не ломать логику и голову, проще сразу в команду где надо добавить завершающий символ.
3 переносимость, в stm32 никаких serial и prinln нет, все ручками писать приходиться.
а уберите и посмотрите warning компилятора ![]()
Поняла. Нужно.
(до этого момента ещё не напрограммировала, делаю список команд, точнее у вас копирую)
А по поводу pgm_read_word_near?
Что с ним не так
?
Не понял вопроса
Чем отличается pgm_read_word от pgm_read_word_near
Не понял, не вижу разницы.
Приведите пример/вопрос.
Опечаталась, исправила.
Не подскажу ![]()
Не знаю, доки читать, может из коллег ща че подскажет.
Ничем.
Откройте файл pgmspace.h (он в папке <папка IDE>\hardware\tools\avr\avr\include\avr) и там легко найдёте такую строчку:
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
Так что, как видите …
По идее есть pgm_read_word_near и pgm_read_word_far. Отличаются длиной адреса и, соответственно, максимально допустимым адресным пространством. pgm_read_word_near, очевидно, может адресоваться только в первые 64К, что вполне приемлемо для Uno, но может оказаться недостаточно для Mega.
Ну а pgm_read_word, очевидно, псевдоним к какому-то из двух перечисленных. Соответствует режиму по умолчанию. Подробности Петрович выше уже изложил.
Спасибо.
#define MAX_BUF 50
#include "Modem.h"
Значение #define MAX_BUF 50 не будет видно в файле библиотеки Modem.h?
Это правильно?
ua6em (на старом форуме )
Наверно должно быть так:
SoftwareSerial SimPort(9, 10); // RX, TX
SIM800 mySim(SimPort);
А в классе я как объявлю SimPort? Каккой тип переменной?
это видимо к взрослым дядям вопрос, как в свой класс включить объект
может начать с функционала, а не с библиотеки.
И мы ж не видим кода Modem.h и всего остального что бы предметно советовать.
И если уж делать библиотеку, то все параметры буферов и прочего не должны быть видны остальному кодую
#define RX 9
#define TX 2
SoftwareSerial port(rx, tx);
#include "Modem.h"
Modem SIM800(port);
void setup() {
Serial.begin(9600);
}
void loop() {
}
//Modem.h
#pragma once
#include <Arduino.h>
class Modem {
public:
Modem (port);//??
private:
};