Страница 1 из 1

Настройка UART

Добавлено: Ср мар 11, 2015 14:22:55
Maguark
День добрый.
Я пишу программу под Raspberry на C++.
Мне необходимо принимать данные по UART пакетами, условие конца пакета это расстояние между ними в 5 байт(приблизительно 2.6мС(скорость 19200))
Я Инициализирую UART так:

Код: Выделить всё

	fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY );

	if (fd == -1)
	    {
	    perror(argv[1]);
	    return -1;
	    }
	if (tcgetattr(fd, &serial) < 0)
	    {
	    perror("Getting configuration");
	    return -1;
	    }
	// Set up Serial Config
	serial.c_iflag = 0;
	serial.c_oflag = 0;
	serial.c_lflag = 0;
	serial.c_cflag = 0;

	serial.c_cc[VMIN] = 255;
	serial.c_cc[VTIME] = 1;

	serial.c_cflag = B19200 | CS8 | CREAD | PARENB;
	serial.c_cflag &=~CSTOPB;

	tcsetattr(fd, TCSANOW, &serial); //apply config
Реально промежутки между командами около секунды. Поэтому промежуток 0.1С меня устроит. Хотя я не где не нашел можно ли задавать меньше. Можно ли написать serial.c_cc[VTIME] = 0.1;?
Если я все правильно понимаю, то по-идее UART будет заполнять свой буффер пока не примет 255 байт или промежуток времени после последнего принятого байта превысит VTIME*0.1.
Но в реальности UARt формирует мне у себя в буфере 8-10 символов.
В основном теле программы я считываю буфер таким образом:

Код: Выделить всё

	if (rcount= read(fd, buffer, sizeof(buffer)) > 0)
	{}
Читал у вас на форуме тему с проблемой подобной моей, но ответов я не нашел:
http://radiokot.ru/forum/viewtopic.php?f=20&t=59386

Re: Настройка UART

Добавлено: Чт мар 12, 2015 13:10:40
Maguark
Ответ так и не нашел пока что...
Вопрос модератором, можно ли создать такую-же тему в другом разделе форума? Может мой спаситель просто не читает этот раздел.
Как я писал ранее, подобный вопрос уже поднимался у вас на форуме в другом разделе. Но мне показалось логичнее разместить свой вопрос тут.

Re: Настройка UART

Добавлено: Ср апр 01, 2015 21:18:38
ProtonM16
Народ, помогите. Не работает элементарная отправка единицы по UARTу и не знаю, где ошибка. Подскажите, пожалуйста. Плата stm32f051

#include <stm32f0xx.h>

int main(void)
{
RCC->APB2ENR |= 0x00020000; //RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= 0x00080000; //GPIO_MODER_MODER9_1;
GPIOA->OSPEEDR |= 0x000C0000; //~GPIO_OSPEEDER_OSPEEDR9;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
USART1->CR1 |= USART_CR1_UE;
USART1->CR2 |= 0x0;
USART1->BRR=0x1388;
USART1->CR1 |= USART_CR1_TE;
while (1)
{ //if ((GPIOA->IDR & GPIO_Pin_0) != 0)
{
while(!(USART1->ISR & 0x40)){}; //USART_SR_TC
USART1->TDR=1;
}
}

}