Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 uart как передать нулевой байт
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dениs
Вообщем вся тема в заголовке ) Вроде бы банально но не могу понять как UART заставить это сделать ... так как когда буфер пуст там 0x00, а я ему говорю еще записать 0x00 естественно он ничего не передает, какой флаг дернуть в принудительном порядке чтобы его заставить отослать нуль ?
Jekin
Передача начинается сразу после записи в регистр данных передатчика (USART_DR), т.е. условием старта передачи является сам факт записи в регистр. Таким образом предыдущее значение регистра неважно.
ViKo
UART не смотрит на то, что ему передали на выдачу. Ему важен сам процесс записи в него (в регистр DR). И тогда он не пуст.
Dениs
Цитата(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 в принятой посылке нуля нету ? Загадка не правда ли ?
ViKo
Вы хотите сказать, что посылая длинное сообщение, вы принимаете его с пропущенными нулями? Не может такого быть.
Dениs
Цитата(ViKo @ Dec 1 2014, 11:58) *
Вы хотите сказать, что посылая длинное сообщение, вы принимаете его с пропущенными нулями? Не может такого быть.


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

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


Что значит программный косяк если я записываю в регистр 0x0000а он не передается ? Какой тогда программый, это аппратный косяк, с DMA работает ! Нужно флаг для передачи установить какой-то, какой ?
ViKo
Исходники - в студию! w00t.gif
scifi
Цитата(Dениs @ Dec 1 2014, 13:25) *
Что значит программный косяк если я записываю в регистр 0x0000а он не передается ?

Вообще-то факт передачи устанавливается при помощи осциллографа. Что-то мне подсказывает, что вы так не проверяли.
Ну и при записи в регистр DR передача может не происходить, если не дождаться отправки предыдущего байта и сразу записать туда следующий. UART тупо не успеет передать.
Dениs
Цитата(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);
}

Я уже скидывал исходники и показывал
kolobok0
Цитата(Dениs @ Dec 1 2014, 12:53) *
... Загадка не правда ли ?


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

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


SSerge
Самое время взять учебник и почитать как работает функция strlen().
nx6310
забей в бесконечный цикл совю функцию передачи и посмотри будет передача или нет
Код
while(1)Machines_SendData(0x00);
Integro
Цитата(Dениs @ Dec 1 2014, 13:56) *
...


Где вызов Machines_SendStr?
anpaza
Отгадка простая - терминалка (или какая там программа принимает байты на второй стороне) сжирает нуль.
Тоже на это нарывался, писал в лог с терминалки а устройство толкало бинарные дампы. Приезжало всё нетронутое, кроме нулей sm.gif
Большинство C программ, которые трактуют поток из COM порта как строки, пропускают нуль.
Проще всего дампить через что-то типа cat /dev/ttyUSBx >file.bin
Golikov A.
потому что 0 - признак конца текстовой строки
mkdx
Сам недавно столкнулся при попытке сделать приборчик. Если чисто для проверки посылаемых байт, нужен терминал с поддержкой вывода сырых данных а не символов. br@y's terminal в режиме вывода шестнадцатиричных чисел или realterm (вообще очень мощная штука с фильтром и синхронизацией) покажут нули. А так, да, любой символьный терминал словив один ноль второй ноль не покажет ибо это \0 тобишь конец строки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.