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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 uart как передать нулевой байт
Dениs
сообщение Dec 1 2014, 09:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-12-12
Пользователь №: 74 984



Вообщем вся тема в заголовке ) Вроде бы банально но не могу понять как UART заставить это сделать ... так как когда буфер пуст там 0x00, а я ему говорю еще записать 0x00 естественно он ничего не передает, какой флаг дернуть в принудительном порядке чтобы его заставить отослать нуль ?
Go to the top of the page
 
+Quote Post
Jekin
сообщение Dec 1 2014, 09:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 9-09-07
Из: Минск
Пользователь №: 30 406



Передача начинается сразу после записи в регистр данных передатчика (USART_DR), т.е. условием старта передачи является сам факт записи в регистр. Таким образом предыдущее значение регистра неважно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 1 2014, 09:47
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



UART не смотрит на то, что ему передали на выдачу. Ему важен сам процесс записи в него (в регистр DR). И тогда он не пуст.
Go to the top of the page
 
+Quote Post
Dениs
сообщение Dec 1 2014, 09:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-12-12
Пользователь №: 74 984



Цитата(ViKo @ Dec 1 2014, 11:47) *
UART не смотрит на то, что ему передали на выдачу. Ему важен сам процесс записи в него (в регистр DR). И тогда он не пуст.


Факт остается фактом, при записи :
while (!(MACHINES->SR & USART_FLAG_TXE))
os_dly_wait(1);

MACHINES->DR = (ch & 0x01FF);
return(ch);

0x00 в принятой посылке нуля нету ? Загадка не правда ли ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 1 2014, 09:58
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вы хотите сказать, что посылая длинное сообщение, вы принимаете его с пропущенными нулями? Не может такого быть.
Go to the top of the page
 
+Quote Post
Dениs
сообщение Dec 1 2014, 10:11
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-12-12
Пользователь №: 74 984



Цитата(ViKo @ Dec 1 2014, 11:58) *
Вы хотите сказать, что посылая длинное сообщение, вы принимаете его с пропущенными нулями? Не может такого быть.


Что значит не может быть если я сейчас это наблюдаю, это объективная реальность моего текщего состояния )
Да посылая сообщение с нулями методом что я привел выше в приемной посылке нулей нету ... а если с помощью DMA то тогда все в проядке ) Но как сделать при записи в регистр чтобы передавался 0x00 ...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 1 2014, 10:18
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Dениs @ Dec 1 2014, 13:11) *
Что значит не может быть если я сейчас это наблюдаю, это объективная реальность моего текщего состояния )
Да посылая сообщение с нулями методом что я привел выше в приемной посылке нулей нету ... а если с помощью DMA то тогда все в проядке ) Но как сделать при записи в регистр чтобы передавался 0x00 ...

Просто вы их (0x00) не посылаете. rolleyes.gif Программный косяк. Проверьте в отладчике.
Или при приеме косяк программный.
Go to the top of the page
 
+Quote Post
Dениs
сообщение Dec 1 2014, 10:25
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-12-12
Пользователь №: 74 984



Цитата(ViKo @ Dec 1 2014, 12:18) *
Просто вы их (0x00) не посылаете. rolleyes.gif Программный косяк. Проверьте в отладчике.
Или при приеме косяк программный.


Что значит программный косяк если я записываю в регистр 0x0000а он не передается ? Какой тогда программый, это аппратный косяк, с DMA работает ! Нужно флаг для передачи установить какой-то, какой ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 1 2014, 10:33
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Исходники - в студию! w00t.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 1 2014, 10:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Dениs @ Dec 1 2014, 13:25) *
Что значит программный косяк если я записываю в регистр 0x0000а он не передается ?

Вообще-то факт передачи устанавливается при помощи осциллографа. Что-то мне подсказывает, что вы так не проверяли.
Ну и при записи в регистр DR передача может не происходить, если не дождаться отправки предыдущего байта и сразу записать туда следующий. UART тупо не успеет передать.
Go to the top of the page
 
+Quote Post
Dениs
сообщение Dec 1 2014, 10:56
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-12-12
Пользователь №: 74 984



Цитата(ViKo @ Dec 1 2014, 12:33) *
Исходники - в студию! w00t.gif


CODE
/********************************************************************************
*************
* RX from modem is comleted
********************************************************************************
*************/
void Machines_ReceiveData(void)
{
USART_ClearITPendingBit(MACHINES, USART_IT_RXNE);
uint8_t data = MACHINES->DR;
if(strlen((char *)machinesBuf) < MACHINES_BUFFER && strlen((char *)machinesBuf) < 5)
{
machinesBuf[strlen((char *)machinesBuf)] = data;
}
else if(strlen((char *)machinesBuf) >= 5)
{
machinesBuf[strlen((char *)machinesBuf)] = data;
}
else
{
memset((uint8_t *)machinesBuf,0,sizeof(uint8_t)*MACHINES_BUFFER);
machinesBuf[0] = data;
}
}

/******************************************************************************
* TX string to ZigBee modem
*******************************************************************************/
void Machines_SendStr(char *string, uint16_t len)
{
uint8_t i = 0;
while(i < len)
{
Machines_SendData(string[i]);
i++;
}
}

/********************************************************************************
*************
* TX char to ZigBee modem
********************************************************************************
*************/
unsigned short Machines_SendData(unsigned short ch)
{
while (!(MACHINES->SR & USART_FLAG_TXE))
os_dly_wait(1);

if(ch != 0x00)
MACHINES->DR = (ch & 0x01FF);
else
MACHINES->DR = 0x0000;
return(ch);
}

Я уже скидывал исходники и показывал

Сообщение отредактировал IgorKossak - Dec 2 2014, 19:35
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 1 2014, 10:59
Сообщение #12


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Dениs @ Dec 1 2014, 12:53) *
... Загадка не правда ли ?


тут уже выше задали правильный вопрос (обратите внимание на тонкий момент):

...в середине пачки...


Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 1 2014, 11:27
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Самое время взять учебник и почитать как работает функция strlen().


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
nx6310
сообщение Dec 1 2014, 15:03
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



забей в бесконечный цикл совю функцию передачи и посмотри будет передача или нет
Код
while(1)Machines_SendData(0x00);
Go to the top of the page
 
+Quote Post
Integro
сообщение Dec 3 2014, 06:51
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Цитата(Dениs @ Dec 1 2014, 13:56) *
...


Где вызов Machines_SendStr?

Сообщение отредактировал IgorKossak - Dec 4 2014, 16:21
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:47
Рейтинг@Mail.ru


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