реклама на сайте
подробности

 
 
> потеря данных при передаче через UART
Andrey_C
сообщение Mar 16 2016, 11:23
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 16-03-16
Пользователь №: 90 882



Добрый день! Помогите пожалуйста разобраться в следующем:

С микроконтроллера на внешнее устройство через UART с частотой около 2 Гц уходят наборы управляющих команд. Общий объем данных в одном наборе около 1500 байт.
При передаче происходит потеря данных, например: из этих 1500 байт может сначала послать сколько-то байт данных, потом сколько нибудь пропустит и дослать оставшиеся ;
либо может передать часть данных,и начать передавать набор с начала.
сначала отключил все прерывания(изначально отправлялось по таймеру), убрал все вызовы функций опроса датчиков,клавиатуры.
В итоге просто запихал все в массив,который обхожу в цикле и все равно что-то не получается локализовать причину такого поведения программы.
Заранее благодарю.
код прилагаю:

CODE

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
char KUKU[]="GR SF 1\r\nGR T 20 0 x1\r\nGR SC WHITE\r\nGR L 408 270 408 200 0\r\nGR L 408 290 408 310 0\r\n\
GR L 408 310 408 360 1\r\nGR L 398 280 378 280 0\r\nGR L 378 280 328 280 1\r\nGR L 418 280 438 280 0\r\nGR L 438 280 488 280 1\r\n\
GR SC WHITE\r\nGR R 670 1 760 46 1\r\nGR B 660 11 670 36\r\nGR B 680 5 760 42\r\nGR SF 1\r\nGR T 20 550 -60°C\r\nGR SF 1\r\n\
GR T 300 550 Азимут: -1°\r\nGR SC WHITE\r\nGR L 20 416 31 433 0\r\nGR L 31 433 42 444 0\r\nGR L 42 444 53 452 0\r\n\
GR L 53 452 64 458 0\r\nGR L 64 458 75 463 0\r\nGR L 75 463 86 466 0\r\nGR L 86 466 97 469 0\r\nGR L 97 469 108 472 0\r\n\
GR L 108 472 119 474 0\r\nGR L 119 474 130 476 0\r\nGR L 130 476 141 478 0\r\nGR L 141 478 152 479 0\r\nGR L 152 479 163 480 0\r\n\
GR L 163 480 174 481 0\r\nGR L 174 481 185 483 0\r\nGR L 185 483 196 485 0\r\nGR L 196 485 207 486 0\r\nGR L 207 486 218 487 0\r\n\
GR L 218 487 229 488 0\r\nGR L 229 488 240 489 0\r\nGR L 240 489 251 489 0\r\nGR L 251 489 262 490 0\r\nGR L 262 490 273 491 0\r\n\
GR L 273 491 284 491 0\r\nGR L 284 491 295 492 0\r\nGR L 20 500 295 500 0\r\nGR SF 0\r\nGR L 20 500 20 505 0\r\nGR T 20 507 1\r\n\
GR L 64 500 64 505 0\r\nGR T 64 507 2\r\nGR L 108 500 108 505 0\r\nGR T 108 507 3\r\nGR L 152 500 152 505 0\r\nGR T 152 507 4\r\n\
GR L 185 500 185 505 0\r\nGR T 185 507 5\r\nGR L 207 500 207 505 0\r\nGR T 207 507 6\r\nGR L 229 500 229 505 0\r\nGR T 229 507 7\r\n\
GR L 251 500 251 505 0\r\nGR T 251 507 8\r\nGR L 273 500 273 505 0\r\nGR T 273 507 9\r\nGR L 295 500 295 505 0\r\nGR T 295 507 10\r\n\
GR SC WHITE\r\nGR C 700 500 50 0\r\nGR L 700 500 699 450\r\nGR SF 1\r\nGR T 691 450 c\r\nGR T 691 525 ю\r\nGR T 730 486 в\r\nGR T 655 486 з\r\nGR D\r\n";


void UART1_Send(char *ch);
void Init_all(void);
void TfmInit(void);
void cmd_delay(void);

int main(void)
{
volatile uint32_t i;

__enable_irq();
//инициализация процессора
Init_all();
//Инициализация модуля
TfmInit();

while (1)
{
for(i=0;i<0x28676C;i++);//тупим
UART1_Send(KUKU);
cmd_delay();

}
}


void TfmInit(void)
{
volatile uint32_t i;
for(i=0;i<0x1ffffff;i++);//пауза-ждем инициализации внешнего устройства
UART1_Send ("GR D\r\n");//
cmd_delay();
UART1_Send ("GR CS\r\n");//
cmd_delay();
UART1_Send ("GR D\r\n");//
cmd_delay();
UART1_Send("D SET REG 19 0\r\n");//
cmd_delay();
UART1_Send("D SET REG 17 0\r\n");//
cmd_delay();
UART1_Send("D SET REG 20 0\r\n");//
cmd_delay();
UART1_Send("D SET REG 18 0\r\n");//
cmd_delay();
UART1_Send("D SET REG 4 215\r\n");//
cmd_delay();

}

void UART1_Send(char *ch)
{
unsigned int len,i;
char *p = ch;


while (*p)
{
while( (USART1->SR & USART_SR_TXE) == 0);

USART1->DR = *p; p++;

}
while((USART1->SR & USART_SR_TC) == 0);
USART1->SR &= ~USART_SR_TC;
}

void cmd_delay(void)
{
volatile int delay;
delay=0x7ff;
while(delay!=0)delay--;

}

void Init_all(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

///////////////////////////////////////////////////////////////////////////////////////////
// INIT PERIPHERAL CLOCK
///////////////////////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);



///////////////////////////////////////////////////////////////////////////////////////////
// PORTA 9:10 RxTx USART1
///////////////////////////////////////////////////////////////////////////////////////////
/* Configure USART1 Rx as input floating */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOA, &GPIO_InitStructure);


/* Configure USART1 Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
///////////////////////////////////////////////////////////////////////////////////////////
// - BaudRate = 57600 baud
// - Word Length = 8 Bits
// - One Stop Bit
// - no parity
// - Hardware flow control disabled (RTS and CTS signals)
// - Receive and transmit enabled
//
///////////////////////////////////////////////////////////////////////////////////////////
USART_InitStructure.USART_BaudRate = 57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;

/* Configure USART1 */
USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

}


Сообщение отредактировал Andrey_C - Mar 16 2016, 11:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aaron
сообщение Mar 17 2016, 07:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Цитата
При передаче происходит потеря данных, например: из этих 1500 байт может сначала послать сколько-то байт данных, потом сколько нибудь пропустит и дослать оставшиеся ;
либо может передать часть данных,и начать передавать набор с начала.

Может дело в МК? Сброса не происходит внезапного? Проверьте пропай ножек МК. Тактирование от чего ведётся - внешний кварц? Мб там что-то не то. Попробуйте затактировать от внутреннего генератора, как изменится поведение?
Если это точно весь код, и при этом у вас может начать сначала передавать данные внезапно (вы ведь не врёте, правда? cool.gif ), то тут явно дело в железе.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 17 2016, 08:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Aaron @ Mar 17 2016, 13:02) *
Если это точно весь код, и при этом у вас может начать сначала передавать данные внезапно (вы ведь не врёте, правда? cool.gif ), то тут явно дело в железе.

Для исключения проблем в железе предназначены отладочные платы. Разработка ПО обычно начинается с работы на отладочной плате, это позволяет подстраховаться от проблем по-крайней мере со стороны железа на начальном этапе.
Go to the top of the page
 
+Quote Post
Andrey_C
сообщение Mar 17 2016, 14:10
Сообщение #4





Группа: Новичок
Сообщений: 4
Регистрация: 16-03-16
Пользователь №: 90 882



Цитата(jcxz @ Mar 17 2016, 11:06) *
Для исключения проблем в железе предназначены отладочные платы. Разработка ПО обычно начинается с работы на отладочной плате, это позволяет подстраховаться от проблем по-крайней мере со стороны железа на начальном этапе.

Немного наврал,точнее недоговорил,извиняюсь-уже нервный стресс испытывать начинаю.... Отправляет не всегда криво,может выслать массив целиком несколько раз (число правильных посылок всегда разное) а потом возникает собственно проблема описанная выше.

Кроме своей платы использовал и отладочную плату с другим процессором (тоже стм32,только памяти побольше).

МК,не сбрасывается, проверял и отладчиком, и при резете выдавал в другой порт строчку- все железно. Непропай, плохой кварц наверное можно исключить с большой долей вероятности, т.к. тестировал код на другой плате с другим процем и кварцем.

Цитата
А у Вы вообще с UART ранее работали на таком железе? Может у вас это CMSIS кривой....
Я бы у меня встретилась подобна непонятная ошибка я бы пошел последовательно
1. Проверить железку на FT232RL - замкнув RX c TX b посмотрев эхо
2. Проверить аналогично эхо уже на своей плате, например посылать раз в какое то время байт от 0 до 255 и проверять эхо
3. Соединить с компом и проверить идут ли простые посылки
...
если в пункте 2 уже не работает - выкинуть нафиг CMSIS

На стмках c UARTом уже работал, все вроде бы успешно было. CMSIS сначала был стмовский-когда в кейле писал. Сейчас- который в стандартной поставке ИАРА (6.20 версия)
1- железку проверял,посылал целиком файл с набором данных из листинга программы- все стабильно приходит несколько раз подряд.
2- плату честно не догадался проверить таким образом,спасибо за совет- попробую.
3- простые посылки идут нормально.

FT232 уже заменил - пофигу.
по поводу сброса флага-спасибо, недосмотрел даташит сначала-сбрасывается оригинально- поправил smile3046.gif
Если честно,то ситуация П%%%%%Ц непонятная для меня, вроде бы почти все проверено, и в другом железе в т.ч. , программно-все около дела; через ДМА,прерывания,тупо циклом-результат стабильно х...й.

может сплошным потоком 1500 байт СТМовский УАРТ не держит за раз?!

Вобщем,попробую эхо на контроллере-отпишусь,как и что.....спасибо большое за участие!

Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Mar 17 2016, 21:50
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Andrey_C @ Mar 17 2016, 17:10) *
уже нервный стресс испытывать начинаю....

Вы этта... Отдохните, сделайте перерыв, поспите, погуляйте. А потом, с новыми силами- за разборки.
Перво-наперво: нужна система. хаотические прыжки в разные стороны (другой компилятор, другое железо...) не приведут к сужению области возможных значений, если непонятно что Вы хотите проверить и доказать в ходе этого конкретного прыжка.
И еще эти прыжки ну никак не помогут в процессе решения следующей проблемы, так как никакого опыта не дали, даже если и привели к случайному нахождению проблемы.

Разбейте проблему на независимые кусочки и подумайте, как в ходе каждого эксперимента, не используя другие еще не проверенные кусочки, можно доказать работоспособность или наличие ошибки в данном проверяемом модуле.

Например, у Вас система связи, которая состоит из :
1) передатчик
2) линия связи
3) приемник.

Убедившись, какая часть не работает, дальше детализируете эту часть на более мелкие кусочки, которые можно независимо проверить.


Проверка передатчика состоит в том, чтобы принять байты чем-то гарантированно работающим.
Проверка приемника делается приемом заведомо известной последовательности байтов.

У Вас же проверяется все вместе и работоспособность чего-то не доказана. Может, у Вас в разъеме компьютера земля плохо контачит, а Вы компилятор меняете.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andrey_C   потеря данных при передаче через UART   Mar 16 2016, 11:23
- - KRS   Попробуйте для начала скорость UART уменьшить, нап...   Mar 16 2016, 11:45
- - Andrey_C   Сейчас попробую, а можете объяснить взаимосвязь? ...   Mar 16 2016, 12:09
|- - KRS   Цитата(Andrey_C @ Mar 16 2016, 15:09) Сей...   Mar 17 2016, 07:56
- - SasaVitebsk   Терминал может некоторые символы проглатывать. Счи...   Mar 16 2016, 13:12
- - Andrey_C   Спасибо за ответ! Управление потоком естествен...   Mar 16 2016, 13:22
- - alag57   Цитата(Andrey_C @ Mar 16 2016, 16:23) Код...   Mar 16 2016, 14:24
|- - scifi   Цитата(alag57 @ Mar 16 2016, 17:24) Когда...   Mar 16 2016, 14:29
|- - Kabdim   Цитата(alag57 @ Mar 16 2016, 17:24) Когда...   Mar 16 2016, 15:18
|- - alag57   Цитата(Kabdim @ Mar 16 2016, 20:18) 0 под...   Mar 16 2016, 18:07
- - KRS   А у Вы вообще с UART ранее работали на таком желез...   Mar 17 2016, 08:21
- - esaulenka   Попробуйте другую FT232 (или какой-то другой адапт...   Mar 17 2016, 08:53
- - SasaVitebsk   Добавлю ещё одно, к сказанному Ruslan1. Вероятност...   Mar 18 2016, 06:44
- - ViKo   Прежде, чем искать программные косяки, убедитесь, ...   Mar 18 2016, 06:52
|- - Ruslan1   Цитата(ViKo @ Mar 18 2016, 09:52) Прежде,...   Mar 18 2016, 12:14
|- - rx3apf   Цитата(Ruslan1 @ Mar 18 2016, 15:14) Кста...   Mar 18 2016, 13:09
- - Сергей Борщ   Раз все кинулись оказывать моральную поддержку, по...   Mar 18 2016, 06:53
|- - Ruslan1   Цитата(Сергей Борщ @ Mar 18 2016, 09:53) ...   Mar 18 2016, 11:58
|- - Obam   Цитата(Ruslan1 @ Mar 18 2016, 15:58) Эх м...   Mar 18 2016, 12:07
|- - Сергей Борщ   Цитата(Ruslan1 @ Mar 18 2016, 13:58) Наск...   Mar 18 2016, 13:43
|- - Gorby   Цитата(Ruslan1 @ Mar 18 2016, 13:58) Эх м...   Apr 8 2016, 11:24
|- - Ruslan1   Цитата(Gorby @ Apr 8 2016, 14:24) Блин...   Apr 8 2016, 20:00
|- - SasaVitebsk   Цитата(Ruslan1 @ Apr 8 2016, 23:00) Я мно...   Apr 11 2016, 07:41
|- - AHTOXA   Это вам повезло просто. Вот, ознакомьтесь.   Apr 11 2016, 08:55
|- - Ruslan1   Цитата(AHTOXA @ Apr 11 2016, 11:55) Это в...   Apr 11 2016, 13:27
|- - AHTOXA   Цитата(Ruslan1 @ Apr 11 2016, 18:27) Если...   Apr 11 2016, 15:00
||- - Ruslan1   Цитата(AHTOXA @ Apr 11 2016, 18:00) Потом...   Apr 11 2016, 19:43
||- - AHTOXA   Цитата(Ruslan1 @ Apr 12 2016, 00:43) Если...   Apr 12 2016, 03:51
||- - Ruslan1   Цитата(AHTOXA @ Apr 12 2016, 06:51) У вас...   Apr 12 2016, 11:15
|- - KnightIgor   Цитата(Ruslan1 @ Apr 11 2016, 14:27) Но в...   Apr 12 2016, 10:33
- - ViKo   24 Мвыб/с в одноканальном режиме - не впечатляет, ...   Mar 18 2016, 14:03
|- - Ruslan1   Цитата(ViKo @ Mar 18 2016, 17:03) 24 Мвыб...   Mar 18 2016, 22:06
||- - HardEgor   Цитата(Ruslan1 @ Mar 19 2016, 04:06) обяз...   Mar 19 2016, 11:41
|- - arhiv6   ЦитатаСсылку на самый достойный из дешевых лог. ан...   Mar 19 2016, 08:02
- - ViKo   Да, на официальном сайте я уже изучил вдоль и попе...   Mar 19 2016, 07:36
- - esaulenka   (раз уж взялись оффтопить...) Руслан, а как этот ...   Mar 19 2016, 08:49
- - PeterBr   Демонстрационный код работы USART STM32. Пример ко...   Apr 8 2016, 00:51
- - картошка   Если используешь FTDI и WIN7. Бросай FTDI в топку....   Apr 8 2016, 11:04


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 13:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016