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;
}