Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197

Прием данных по UART на STM32F0

10.03.2023, 10:28. Показов 6324. Ответов 35

Студворк — интернет-сервис помощи студентам
Здравствуйте. При попытке принять пачку байтов читаю только 1 байт, в прерывание повторно заходит, но RXNE не поднят

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void USART1_IRQHandler()
{
    if (LL_USART_IsActiveFlag_RXNE(USART1))
        {
            receiveData[pos] = LL_USART_ReceiveData8(USART1);
            pos++;
        }
    if (pos == 4)
        {
            pos = 0;
        }
    if (receiveData[0] == 'r' && receiveData[1] == 'e' && receiveData[2] == 'a' && receiveData[3] == 'd' && receiveData[4] == 'y')
        {
            LL_ADC_REG_StartConversion(ADC1);
        }
    if (LL_USART_IsActiveFlag_IDLE(USART1))
        {
            LL_USART_ClearFlag_IDLE(USART1);
            for (int i=0;i<5;++i)
                {
                    receiveData[i] =0;
                }
        }
}
IDLE пытался использовать в качестве "таймаута", видел, что Rius RTO советует еще использовать, но пока не пробовал. Отправляю 5 байт, это вижу в отладке с компьютера. Через st-util смотрю в отладке прием байт на самой плате.
Включение прерывания по RXNE включает еще по ORE, на overrun не проверял.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2023, 10:28
Ответы с готовыми решениями:

Прием данных по UART с прерыванями
Всем привет! У меня проблема пи работе с UART. Если отправить данные в терминал получается легко, то с приемом все несколько сложнее....

UART на STM32F4Discovery (некорректный прием данных)
Приветствую всех! Изучаю stm32 вместе с stm32f4-discovery на coosox. Проблема с настройкой USORT2 на данной плате. Делаю все по...

Прием данных с UART
Вопрос скорее архитектурного плана. МК принимает по UART пакеты данных. Протокол бинарный. Формат следующий: OC|ADR|CMD|N|DATA OCh -...

35
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
11.03.2023, 18:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Enyt Посмотреть сообщение
когда я передаю на мк несколько байт (пусть будет 2), для меня это немного непонятно
я не понимаю ваших непоняток :-(
флаг поднимается если вы не забрали предыдущий байт с RDR и уже пришел новый..
решение на поверхности - вовремя забирайте (в прерывании)
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 15:35
В HAL по дебильному устроена функция приема usart. Там вызов колбека происходит когда весь массив заполнен. И выходит я не смогу контролировать массив если допустим пакет пришол не полный.

Добавлено через 13 минут
Вот если можно было как то переходить по вектору прерывания и вызывать отдельную функцию когда регистор приемника полон вот тогда да было бы здорово.

Добавлено через 4 часа 24 минуты
Ошибся можно и один байт принимать через прерывание.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
12.03.2023, 16:03
Цитата Сообщение от VladimirU Посмотреть сообщение
Вот если можно было как то переходить по вектору прерывания и вызывать отдельную функцию когда регистор приемника полон вот тогда да было бы здорово.
ну а кто тебе мешает?
Вот например мое решение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
    DmxRead();// моя функция принимает и анализирует побайтно
// здесь добавляешь свои функции или действия
  /* USER CODE END USART3_IRQn 0 */
 
//вот здесь можно выбросить все callBack функции 
// на нужно контролировать  и очищать все флаги 
  HAL_UART_IRQHandler(&huart3);
// но при перегенерации Cube опять создаст эту функцию 
 
  /* USER CODE BEGIN USART3_IRQn 1 */
  __HAL_UART_ENABLE_IT(&huart3,UART_IT_RXNE);
 // вот здесь тоже можно создать свои действия
// например
// tmp=USART3->DR;
 
  /* USER CODE END USART3_IRQn 1 */
}
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 16:13
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а кто тебе мешает
C
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  uint32_t isrflags   = READ_REG(huart->Instance->SR);
  uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  uint32_t cr3its     = READ_REG(huart->Instance->CR3);
  uint32_t errorflags = 0x00U;
  uint32_t dmarequest = 0x00U;
 
  /* If no error occurs */
  errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
  if (errorflags == RESET)
  {
    /* UART in mode Receiver -------------------------------------------------*/
    if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }
  }
 
  /* If some errors occur */
  if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET)
                                || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
  {
    /* UART parity error interrupt occurred ----------------------------------*/
    if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_PE;
    }
 
    /* UART noise error interrupt occurred -----------------------------------*/
    if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_NE;
    }
 
    /* UART frame error interrupt occurred -----------------------------------*/
    if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_FE;
    }
 
    /* UART Over-Run interrupt occurred --------------------------------------*/
    if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET)
                                                 || ((cr3its & USART_CR3_EIE) != RESET)))
    {
      huart->ErrorCode |= HAL_UART_ERROR_ORE;
    }
 
    /* Call UART Error Call back function if need be --------------------------*/
    if (huart->ErrorCode != HAL_UART_ERROR_NONE)
    {
      /* UART in mode Receiver -----------------------------------------------*/
      if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
      {
        UART_Receive_IT(huart);
      }
 
      /* If Overrun error occurs, or if any error occurs in DMA mode reception,
         consider error as blocking */
      dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
      if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest)
      {
        /* Blocking error : transfer is aborted
           Set the UART state ready to be able to start again the process,
           Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
        UART_EndRxTransfer(huart);
 
        /* Disable the UART DMA Rx request if enabled */
        if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
        {
          ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
 
          /* Abort the UART DMA Rx stream */
          if (huart->hdmarx != NULL)
          {
            /* Set the UART DMA Abort callback :
               will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
            huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;
            if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
            {
              /* Call Directly XferAbortCallback function in case of error */
              huart->hdmarx->XferAbortCallback(huart->hdmarx);
            }
          }
          else
          {
            /* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
            /*Call registered error callback*/
            huart->ErrorCallback(huart);
#else
            /*Call legacy weak error callback*/
            HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
          }
        }
        else
        {
          /* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
          /*Call registered error callback*/
          huart->ErrorCallback(huart);
#else
          /*Call legacy weak error callback*/
          HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
        }
      }
      else
      {
        /* Non Blocking error : transfer could go on.
           Error is notified to user through user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered error callback*/
        huart->ErrorCallback(huart);
#else
        /*Call legacy weak error callback*/
        HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
 
        huart->ErrorCode = HAL_UART_ERROR_NONE;
      }
    }
    return;
  } /* End if some error occurs */
 
  /* Check current reception Mode :
     If Reception till IDLE event has been selected : */
  if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
      && ((isrflags & USART_SR_IDLE) != 0U)
      && ((cr1its & USART_SR_IDLE) != 0U))
  {
    __HAL_UART_CLEAR_IDLEFLAG(huart);
 
    /* Check if DMA mode is enabled in UART */
    if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
    {
      /* DMA mode enabled */
      /* Check received length : If all expected data are received, do nothing,
         (DMA cplt callback will be called).
         Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
      uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx);
      if ((nb_remaining_rx_data > 0U)
          && (nb_remaining_rx_data < huart->RxXferSize))
      {
        /* Reception is not complete */
        huart->RxXferCount = nb_remaining_rx_data;
 
        /* In Normal mode, end DMA xfer and HAL UART Rx process*/
        if (huart->hdmarx->Init.Mode != DMA_CIRCULAR)
        {
          /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
          ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
          ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
 
          /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
             in the UART CR3 register */
          ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
 
          /* At end of Rx process, restore huart->RxState to Ready */
          huart->RxState = HAL_UART_STATE_READY;
          huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
 
          ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
 
          /* Last bytes received, so no need as the abort is immediate */
          (void)HAL_DMA_Abort(huart->hdmarx);
        }
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered Rx Event callback*/
        huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
#else
        /*Call legacy weak Rx Event callback*/
        HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
      }
      return;
    }
    else
    {
      /* DMA mode not enabled */
      /* Check received length : If all expected data are received, do nothing.
         Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
      uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount;
      if ((huart->RxXferCount > 0U)
          && (nb_rx_data > 0U))
      {
        /* Disable the UART Parity Error Interrupt and RXNE interrupts */
        ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
 
        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
 
        /* Rx process is completed, restore huart->RxState to Ready */
        huart->RxState = HAL_UART_STATE_READY;
        huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;
 
        ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered Rx complete callback*/
        huart->RxEventCallback(huart, nb_rx_data);
#else
        /*Call legacy weak Rx Event callback*/
        HAL_UARTEx_RxEventCallback(huart, nb_rx_data);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
      }
      return;
    }
  }
 
  /* UART in mode Transmitter ------------------------------------------------*/
  if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
  {
    UART_Transmit_IT(huart);
    return;
  }
 
  /* UART in mode Transmitter end --------------------------------------------*/
  if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  {
    UART_EndTransmit_IT(huart);
    return;
  }
}
вызывается каждый раз как в регист приёма приходит байт.
Такой объём да ещё используются одни if без else if хотя бы.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
12.03.2023, 16:34
Цитата Сообщение от VladimirU Посмотреть сообщение
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
это колбэк функция
работай на прямую с прерываниями
они генерятся в файле stm32f1xx_it.c

Добавлено через 1 минуту
это колбэк функция
точнее не правильно
это функция которая вызывает колбек функции

Добавлено через 7 минут
например
Цитата Сообщение от VladimirU Посмотреть сообщение
C
1
2
3
4
5
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }
вызывает UART_Receive_IT функцию (колбэк) вызывается при приеме каждого байта
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 16:50
По сути чем хорошо HAL это тем что очень легко конфигурировать периферию STM.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
12.03.2023, 16:55
Цитата Сообщение от VladimirU Посмотреть сообщение
По сути чем хорошо HAL это тем что очень легко конфигурировать периферию STM.
но после нужно "доработать напильником", ну не может мастер сгенерировать код а все случае жизни
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 18:31
Я частично уже перелез на MicroC for ARM но столкнулся с инициализацией USB там мрак.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
12.03.2023, 19:35
Цитата Сообщение от VladimirU Посмотреть сообщение
Я частично уже перелез на MicroC for ARM но столкнулся с инициализацией USB там мрак.
а в чем мрак то ? я на асме все иничу и никакого мрака... нужно вот еще разобраться с отправкой пакетов обмена (все руки не доходят до конца написать), а так прерывания по запросам генерируются, коды запросов получаются....
в самих точках еще бы разобраться немного не хватает инфы мне что нужно например для ком порта, а просто конечную точку создать вроде не сложно...
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 20:04
Цитата Сообщение от ВитГо Посмотреть сообщение
а в чем мрак то
Там регистров инициализации мильён вот в чём.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
12.03.2023, 20:11
Да кстати по теме. Код принимает пачку байт а именно из 10 байт и отправляет обратно. Всё видно в терминале.
C
1
2
3
4
5
6
7
8
9
10
11
uint8_t data[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_Receive_IT(&huart1, data, 10);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    HAL_UART_Transmit(&huart1, data, 10,1);
}
int main(void)
{
HAL_UART_Receive_IT(&huart1, data, 10);
}
Rec 0001.mp4
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
13.03.2023, 06:19
usb здесь не по теме :-( а так ничего там смертельного в регистрах нет..
0
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197
13.03.2023, 10:29  [ТС]
VladimirU, а как попадает в HAL_UART_RxCpltCallback? мне непонятно( Ну вот пришло прерывание, что буфер приема не пуст, что-то куда-то считали, из HAL_UART_Receive_IT попадаем в Callback? и там снова в HAL_UART_Receive_IT ? это же обработчик прерывания или я неправильно понял? Часто в proteus моделируете? насколько хороша там реализация логики МК. Использование cube только для примеров или и для реализации проектов?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
13.03.2023, 13:21
Цитата Сообщение от Enyt Посмотреть сообщение
это же обработчик прерывания или я неправильно понял?
нет обработчик прерываний вот он
Цитата Сообщение от ValeryS Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
    DmxRead();// моя функция принимает и анализирует побайтно
// здесь добавляешь свои функции или действия
  /* USER CODE END USART3_IRQn 0 */
//вот здесь можно выбросить все callBack функции 
// на нужно контролировать  и очищать все флаги 
  HAL_UART_IRQHandler(&huart3);
// но при перегенерации Cube опять создаст эту функцию 
/* USER CODE BEGIN USART3_IRQn 1 */
  __HAL_UART_ENABLE_IT(&huart3,UART_IT_RXNE);
 // вот здесь тоже можно создать свои действия
// например
// tmp=USART3->DR;
/* USER CODE END USART3_IRQn 1 */
}
в имени есть IRQHandler
куб генерит обработчик прерываний функцию, в частности HAL_UART_IRQHandler ( HAL_(имя интерфейса)_IRQHandler ),
которая проверяет сбрасывает флаги и вызывают, если нужно, колбэк-функции.

Добавлено через 1 минуту
Цитата Сообщение от Enyt Посмотреть сообщение
Часто в proteus моделируете? насколько хороша там реализация логики МК.
а чем отладчик STLink не угодил?
0
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197
13.03.2023, 14:56  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а чем отладчик STLink не угодил?
Перестраховка, что можно проверить, а получится ли подсоединить то, что ты подсоединяешь и не сгорит ли нога, да, можно всегда что-то по току посчитать +-, но все же.
Цитата Сообщение от ValeryS Посмотреть сообщение
HAL_UART_IRQHandler
насколько я понимаю адреса функций обработчика прерываний жестко закреплены в МК, получается хал обработчик лишь обертка с таким же адресом.
Но сразу же возникает момент в том, что даже в вашем примере
Цитата Сообщение от ValeryS Посмотреть сообщение
DmxRead();// моя функция принимает и анализирует побайтно
вы выполняете обработку в прерывании, а не просто сбрасываете/устанавливаете 2 флага.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
13.03.2023, 15:00
Цитата Сообщение от Enyt Посмотреть сообщение
вы выполняете обработку в прерывании,
лично я обрабатываю, потому что выгодней прасировать на лету а не собирать все чохом 512 каналов(уровней)
Цитата Сообщение от Enyt Посмотреть сообщение
а не просто сбрасываете/устанавливаете 2 флага.
а вот это зависит от сложности обработки, бывает и флаги просто ставлю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2023, 15:00

Приём данных по UART Atmega8
Доброго времени суток! Продолжаю постигать азы микроконтроллеров. В прошлой теме задавал, как уже понимаю, очень глупый вопрос)) Спасибо...

Прием данных на пк с UART, ATMEGA16
Здравствуйте, не работает прием данных на пк, они не выводятся в TEXTBOX. Отправка с самого МК работает, поскольку в терминале приходят...

Прием данных по UART в 8052
Не могу разобраться с приемом по uart скорость 9600 на 11.0592МГц. 8ми битная посылка. Передача работает, а вот прием нет $MOD52...

LaunchPad: прием данных с UART в MSP430
Здравствуйте! Учусь программировать msp430. Использую launchPad. Никак не могу разобраться как в микроконтроллере принять строку. В...

Корректный прием данных из UART на Delphi
Здравствуйте, с контроллера (ATmega16) через USB-UART в порт посылаю числа (1, 2, 3...), с помощью команды DEB_SEND_R: .MACRO ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru