Вообщем вся тема в заголовке ) Вроде бы банально но не могу понять как UART заставить это сделать ... так как когда буфер пуст там 0x00, а я ему говорю еще записать 0x00 естественно он ничего не передает, какой флаг дернуть в принудительном порядке чтобы его заставить отослать нуль ?
Передача начинается сразу после записи в регистр данных передатчика (USART_DR), т.е. условием старта передачи является сам факт записи в регистр. Таким образом предыдущее значение регистра неважно.
UART не смотрит на то, что ему передали на выдачу. Ему важен сам процесс записи в него (в регистр DR). И тогда он не пуст.
Цитата(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 @ Dec 1 2014, 11:58)

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

Что значит не может быть если я сейчас это наблюдаю, это объективная реальность моего текщего состояния )
Да посылая сообщение с нулями методом что я привел выше в приемной посылке нулей нету ... а если с помощью DMA то тогда все в проядке ) Но как сделать при записи в регистр чтобы передавался 0x00 ...
Просто вы их (0x00) не посылаете.

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

Просто вы их (0x00) не посылаете.

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

Что значит программный косяк если я записываю в регистр 0x0000а он не передается ?
Вообще-то факт передачи устанавливается при помощи осциллографа. Что-то мне подсказывает, что вы так не проверяли.
Ну и при записи в регистр DR передача может не происходить, если не дождаться отправки предыдущего байта и сразу записать туда следующий. UART тупо не успеет передать.
Цитата(ViKo @ Dec 1 2014, 12:33)

Исходники - в студию!

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
Dec 1 2014, 10:59
Цитата(Dениs @ Dec 1 2014, 12:53)

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

...
Где вызов Machines_SendStr?
Отгадка простая - терминалка (или какая там программа принимает байты на второй стороне) сжирает нуль.
Тоже на это нарывался, писал в лог с терминалки а устройство толкало бинарные дампы. Приезжало всё нетронутое, кроме нулей

Большинство C программ, которые трактуют поток из COM порта как строки, пропускают нуль.
Проще всего дампить через что-то типа cat /dev/ttyUSBx >file.bin
Golikov A.
Jan 10 2015, 08:32
потому что 0 - признак конца текстовой строки
Сам недавно столкнулся при попытке сделать приборчик. Если чисто для проверки посылаемых байт, нужен терминал с поддержкой вывода сырых данных а не символов. br@y's terminal в режиме вывода шестнадцатиричных чисел или realterm (вообще очень мощная штука с фильтром и синхронизацией) покажут нули. А так, да, любой символьный терминал словив один ноль второй ноль не покажет ибо это \0 тобишь конец строки.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.