Обсуждаем контроллеры компании Atmel.
Сб июл 03, 2021 05:22:23
Доброго времении суток уважаемые Котаны и Котанки, также Котанята)) Вопрос мой наверное самый Тупой, но ....
В общем есть проект в Atmel Studio. В том проекте несколько файлов DEF.h - где собраны все #дефайны, funct.h с функциями.
- Код:
#define SSD1306_DISPLAYON 0xAF
а в файле с функциями:
- Код:
void LCD_Sleep(char set)
{
....
if(set==1){LCD_Commmand(COMAND,SSD1306_DISPLAYON);}
}
Внутри функции #define не видим - вылезает ошибка. Можно ли как то сделать так чтобы можно было пользоваться этим #define и внутри функции?
Сб июл 03, 2021 17:34:40
Внутри функции #define не видим - вылезает ошибка.
Странно в функции тоже дефайны должны работать. А вы файлы эти с функциями и дефайнами куда подключаете? Попробуйте в файл с функциями подключить файл с дефайнами, а файл с функциями в проект.
Сб июл 03, 2021 17:41:46
Очевидно функция пытается скомпилироваться раньше чем были приняты дефайны. Если они вообще приложены. Либо переносите их содержимое перед функциями.
Что значит несколько? С одинаковым именем?
Сб июл 03, 2021 17:48:54
А вы как файлы подключали
#include <func. h> а затем #include <Def. h> или наоборот (какой первым подключали>
Добавлено after 31 second:
Попробуйте сначала Def. h
Вс июл 04, 2021 00:21:36
В общем есть проект в Atmel Studio. В том проекте несколько файлов DEF.h
Они в солюшн эксплорере добавлены к проекту?
Вт июл 27, 2021 11:49:44
Добрый день,у меня тоже вопрос по программированию МК в Atmel studio.
Вопрос такой:интересует алгоритм написания функции для МК AVR 32,
отправка показаний датчика через GSM модуль (SIM800C) по СМС на мобильник,
например:напряжение с АЦП(зарядное для акб.),
или запрос с мобильного баланса GSM модуля,
есть функция отправки смс с заранее написанными смс,
не могу понять как переделать функцию ,чтобы отправлять по смс ,
постоянно меняющиеся данные с датчика или запрос о балансе,
вот функция USART
void USART_SendString(char *str) /* Отправить строку функции данных USART */
{
int i=0;
while (str[i]!=0)
{
USART_TxChar(str[i]); /* Отправить каждый символ строки до NULL */
i++;
}
}
вот функция отправки смс:
void GSM_Send_Msg(char *num,char *sms)
{
char sms_buffer[35];
buffer_pointer=0;
sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */
while(1)
{
if(buff[buffer_pointer]==0x3e) //*ждать символа '>'*/
{
LCD_String_xy(1,0,"OTPRAVL1");
_delay_ms(3000);
LCD_Clear();
buffer_pointer = 0;
memset(buff,0,strlen(buff));
USART_SendString(sms); //* отправить сообщение на указанный nom. */
USART_TxChar(26);
USART_TxChar(0); //* отправьте Ctrl + Z, тогда будет передаваться только сообщение*/
break;
}
buffer_pointer++;
}
buffer_pointer = 0;
memset(buff,0,strlen(buff));
memset(sms_buffer,0,strlen(sms_buffer));
}
если не трудно объясните,что нужно дописать,
или скиньте ссылку на эту тему.
Ср июл 28, 2021 03:16:41
Ну так вызывай свою функцию GSM_Send_Msg в основном коде. Первый параметр это номер телефона, а второй текст. Только учти что на латинице можно отправить только 160 символов, а на других языках сначала нужно текст перекодировать и получить ограничение 70 символов (кроме немецкого и французского, там 140 символов).
Ср июл 28, 2021 10:50:20
Не много уточню вопрос.
вот функция запроса баланса:
void GSM_Balans_Out()
{
USART_SendString("AT+CUSD=1,\"#100#\"\r"); //AT_команда модулю, проверка баланса SIM
_delay_ms(3000); //Пауза для ответа модуля
int out=0;
_delay_ms(500);
buffer_pointer=0;
buffer_dannye=0;
while(1)
{
if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') //*исключить "\ r \ n", который является началом строки */
{
buffer_pointer++;
}
else
break;
}
LCD_String_xy(1,0,""); //LCD дисплей 1-строка,0-ячейка ответ о балансе//
if(strstr(buff,"+CUSD:")) //* "+CUSD:" чтобы проверить, получено ли сообщение "Balans_" * /
{
while(buff[buffer_pointer]!= ',')
{
buffer_pointer++;
}
buffer_pointer++;
while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye]=buff[buffer_pointer];
buffer_pointer++;
buffer_dannye++;
LCD_Char(msg_location[buffer_dannye+2]); //Выводит текс на экран дисплея//
}
memset(buff,0,strlen(buff)); //* преобразовать строку позиции в целочисленное значение */
buffer_pointer=0;
}
status_flag = 0;
GSM_Send_Msg("+7987******", " msg_location[buffer_dannye]");
Вопрос как передать по смс данные из буфера,а не название буфера?
//=======================//
}
Ср июл 28, 2021 11:10:21
radteh писал(а):Первый параметр это номер телефона, а второй текст.
Неверно.
- Код:
void GSM_Send_Msg(char *num,char *sms)
Первый и второй параметры - указатели.
A^ex,
https://metanit.com/cpp/c/5.7.php
Ср июл 28, 2021 11:41:48
ST7FOX, спасибо ! перешёл по ссылке, всё чётко и понятно расписано!
Пт июл 30, 2021 22:58:32
Всем доброго времени.
Подскажите где ошибка в коде:
void USART_TxChar(char data) /* Функция передачи данных */
{
UDR = data /* Запись данных для передачи в UDR */
while (!(UCSRA & (1<<UDRE))); /* Подождите, пока передача данных и буфер не опустеют */
}
void GSM_Balans_Msg()
{
USART_SendString("AT+CUSD=1,\"#100#\"\r"); //AT_команда модулю, проверка баланса SIM
_delay_ms(3000); //Пауза для ответа модуля
buffer_pointer=0;
buffer_dannye=0;
while(1)
{
if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') //*исключить "\ r \ n", который является началом строки */
{
buffer_pointer++;
}
else
break;
}
if(strstr(buff,"+CUSD:")) //* "+CUSD:" чтобы проверить, получено ли сообщение "Balans_" * /
{
while(buff[buffer_pointer]!= ',')
{
buffer_pointer++;
}
buffer_pointer++;
while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye]=buff[buffer_pointer++];
}
memset(buff,0,strlen(buff)); //* преобразовать строку позиции в целочисленное значение */
buffer_pointer=0;
status_flag = 0;
}
PORTA|=(1<<2);
_delay_ms(1000);
char num[14]={"+79*********"};
char sms_buffer[35];
buffer_pointer=0;
sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */
_delay_ms(200);
while(1)
{
if(buff[buffer_pointer]==0x3e) //*ждать символа '>'*/
{
//LCD_String_xy(1,0,"OTPRAVL1");
//_delay_ms(3000);
//LCD_Clear();
buffer_pointer = 0;
memset(buff,0,strlen(buff));
while(1)
{
buff[buffer_pointer]=msg_location[buffer_dannye++];
USART_TxChar(buff[buffer_pointer]);
if(buff[buffer_pointer]!= '\r')
{
USART_TxChar(0x1a); //*. Ctrl + Z */
break;
}
buffer_pointer++;
}
}
buffer_pointer++;
}
buffer_pointer = 0;
memset(buff,0,strlen(buff));
}
Код работает,смс приходит,но приходит постоянно одна цифра 5 и всё,
откуда цифра 5 берётся?
судя по функции: if(buff[buffer_pointer]!= '\r') данные с балансом там есть,
отправлял в терминал USART_TxChar(buff[buffer_pointer])
в терминале всё как положено:"Balance:27,35r"
в какое направление копать?
Сб июл 31, 2021 06:39:11
с таким оформлением твой код никто изучать не будет
Сб июл 31, 2021 13:15:59
slav0n,а что не так с оформлением кода,а как надо оформлять?
напишите пример оформления кода.
Это часть программы.
нашёл причину, в коде теряются данные
while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye]=buff[buffer_pointer++];
}
оба буфера и переменные глобальные.
msg_location[buffer_dannye] до отправления в USART не обнуляю,
если записать:
while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye]=buff[buffer_pointer++];
USART_TxChar( msg_location[buffer_dannye]);
}
данные приходят,отладчика к сожалению нет,поэтому пользуюсь терминалом.
Вопрос по существу как сохранить данные в массиве,что бы не терялись даже после выхода из функции?
Повторю msg_location[buffer_dannye] и buff[buffer_pointer] глобальные.
Сб июл 31, 2021 14:13:30
ОТСТУПЫ
вот, пропустил твой код через "украшатель"
https://beautifier.io/?without-codemirror
Последний раз редактировалось
slav0n Сб июл 31, 2021 17:59:44, всего редактировалось 1 раз.
Сб июл 31, 2021 14:27:45
Красиво!теперь понятно,спасибо slav0n !
Сб июл 31, 2021 17:45:48
А если вместо тега [code] применить [code=php] то ещё и синтаксис подсветится. И длинные портянки лучше прятать под спойлер.
Сб июл 31, 2021 18:00:10
OK
Пн авг 02, 2021 03:45:03
A^ex, меня смущает вот этот кусочек кода:
- Код:
while (buff[buffer_pointer] != '\r') {
msg_location[buffer_dannye] = buff[buffer_pointer++];
}
Ты каждый раз, одному и тому-же элементу массива
msg_location присваиваешь новое значение. Так-же ты проверяешь один элемент, а присваиваешь следующий.
Пн авг 02, 2021 08:58:25
radteh, инкремент номера элемента (++) делается ПОСЛЕ присваивания, а не до него.
Пн авг 02, 2021 10:23:35
Starichok51, да хоть до, хоть после, хоть оба сразу. Счётчик buffer_dannye не меняется.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.