PROGCONT.RU

Форма входа







Регистрация Вход/

Пример Пример Пример


UART терминал-помощник.

Ссылка на видео в YouTubeЭту программу я создал как простой UART терминал с возможностью выполнения простых арифметических операций с принимаемыми данными для облегчения контроля, например как здесь ниже после описания программы в примере вывода готового результата ADC. Программа бесплатная но если получит хороший отзыв буду создавать более сложную но платную с возможность более сложных вычислений и дополнительными окнами подсчётов и графиков, пишите в комментарии статьи ваши пожелания для функционала. Ссылка на UART_assistant_AAW_v00.exe или с Яндекс диск.

Описание программы.

нет рисунка

Описание элементов:
 1) Настройки COM порта, кнопка SCAN для повторного обнаружения портов и OPEN подключение к выбранному порту;
 2) Выбор формата отображения принимаемой информации: No-не отображать(отключает окно), DEC-десятичный формат, HEX-шестнадцатеричный формат, ASCII-отображение символов и BIN-бинарное;
 3) Контроль отображения принимаемой информации:
   a) Counting data-счётчик принимаемых данных, можно сбросить кнопкой Reset.
   b) String length-количество символов в одной строке, подтверждается кнопкой OK.
   c) Clear Window-очистка окон после принятие установленного количества данных, подтверждается кнопкой OK.
   d) Clear Window-очистка окон.
 4) Отправка данных:
   a) AUTO-включение автоматической отправки данных, после нажатие на SEND данные будут постоянно отправляться через установленный промежуток времени минимальное значение которого 1 миллисекунда, отключение отправки повторное нажатие на SEND.

нет рисунка   b) длинное окно отправляемые данные, возможно отправлять как десятичное значение так и символы в ASCII кодировке, если данных несколько то они должны разделятся запятой и символы должны быть обрамлены скобками(две запятые), за раз отправляется вся строка. Пример отправки данных.
  c) кнопка SEND при нажатие отправляется вся строка, в автоматическом режиме отправка происходит циклически.

 5) Calculate окно ввода задания вычисления и Result готового результата:
  a) Calculate задание, оно может состоять из следующих символов:
   +-сложение
   --минус
   *-умножение
   /-деление
   ,-запятая разделяет целое от нецелого в числе
   ()-скобки, приоритет вычисления
   b-буква после которой должен быть обязательно номер принятого байта с которым будут выполнятся операции
   ;-точка с запятой, должно обязательно заканчиваться задание.
нет рисункаВозможно производить вычисления с отрицательными цифрами и нецелыми в которых разделителем должна быть запятая, смотрите примеры выражений справа.

 6) Synchronisation-настройка синхронизации принимаемых данных и приемного буфера.
Для сброса приёмного буфера перед новым вычислением используется синхронизация по времени, программа ожидает установленное время если данные не пришли производится вычисление, приёмный буфер сбрасывается и заполняется заново. Так же возможна синхронизация по приёму определённого количества байтов после приёма нужного количества производится вычисление, приёмный буфер сбрасывается и заполняется заново.
 Для включения вычислений используется кнопка ON/OFF, так же для работы должен быть выбран один или все два метода синхронизации.

Практика использования.

нет рисунка Практиковаться будем над контроллером STM32F103C8 и пример вывода готового результата ADC, ниже готовая программа в которой настраивается UART и ADC для отправки результата в терминал. К GPIOA выводу 0 подключаем переменный резистор на 10K и соответственно к UART-USB конвертеру как на схеме. Из за простоты подключения показания будут не стабильные, для улучшения результата нужно правильно запитать ADC через выводы VDDA и VSSA.
 После программирования контроллера, он будет отсылать результата преобразования напряжения в терминал который вычислит и отобразит реальное напряжение, для изменения показаний вращайте переменный резистор.
 Формула для вычисления (b0*256+b1)*3,3/4095; скопируйте и вставьте в окно Calculate.

#include "stm32f10x.h"
int main(){

RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA| RCC_APB2Periph_ADC1, ENABLE);

GPIO_InitTypeDef GPIO_uart;
GPIO_uart.GPIO_Pin = GPIO_Pin_9;
GPIO_uart.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_uart.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_uart);
GPIO_uart.GPIO_Pin = GPIO_Pin_10;
GPIO_uart.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_uart);

USART_InitTypeDef UART_struct;
UART_struct.USART_BaudRate = 9600;
UART_struct.USART_WordLength = USART_WordLength_8b;
UART_struct.USART_StopBits = USART_StopBits_1;
UART_struct.USART_Parity = USART_Parity_No;
UART_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
UART_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &UART_struct);
USART_Cmd(USART1, ENABLE);

GPIO_InitTypeDef GPIO_adc;
GPIO_adc.GPIO_Pin = GPIO_Pin_0;
GPIO_adc.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_adc);

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

while(1){
uint16_t adc= ADC_GetConversionValue(ADC1);
USART_SendData( USART1, (uint8_t)(adc>>8));
while( !USART_GetFlagStatus( USART1, USART_FLAG_TXE));
USART_SendData( USART1, (uint8_t)(adc));
for( uint32_t i=0; i<3000000; i++);
}

return 0;
}
нет рисунка

Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!