Необработанные данные printf получают printf или печатают, чтобы НЕ отправлять символы

У меня есть плата Xilinx Virtex-II Pro FPGA, которая подключена через RS232 к iRobot Create.

iRobot принимает поток целых байтов в качестве команд.

Я обнаружил, что printf на самом деле отправляет через последовательный порт (Hypterminal может принимать все, что я печатаю), и я полагаю, что могу использовать printf для отправки своих данных iRobot.

Проблема в том, что printf, кажется, форматирует данные для вывода ascii, но я ДЕЙСТВИТЕЛЬНО хотел бы, чтобы он просто отправлял необработанные данные.

Я хотел бы что-то вроде:

printf(%x %x %x, 0x80, 0x88, 0x08);

Но вместо форматирования шестнадцатеричного числа я бы хотел, чтобы это было отправлено фактическое значение 0x80.

Любые идеи?


person ZacAttack    schedule 03.12.2011    source источник
comment
Поддерживает ли ваш компилятор: printf(0x80,0x88,0x08);?   -  person Jeff    schedule 03.12.2011


Ответы (3)


Используйте fwrite:

char buf[] = { 0x80, 0x80, 0x80 };

fwrite(buf, 1, sizeof(buf), stdout);

Вы можете писать в любой дескриптор файла; stdout — это всего лишь пример, отражающий ваш printf.

В системе Posix вы также можете использовать специфичный для платформы write функция, которая записывает в файловый дескриптор.

person Kerrek SB    schedule 03.12.2011
comment
Это хорошо! Но я не знаю адреса моего стандартного выхода... Думаю, я мог бы попробовать покопаться. Моя идея состоит в том, чтобы просто использовать адрес памяти выхода RS232 RX... Это звучит как правильная идея? - person ZacAttack; 03.12.2011
comment
Зачем тебе какой-то адрес? Вы были счастливы использовать printf ранее, и это то же самое, что и fprintf(stdout, ...)... в чем вопрос теперь? Вы определенно не можете не писать на любой случайный номер. Это должно быть FILE*, которое вы каким-то образом получили законным путем. - person Kerrek SB; 03.12.2011
comment
Хм... Я использовал printf все это время, но, кажется, я не могу включить библиотеку stdio.h, моему компилятору, похоже, это не нравится... Я... в недоумении . Использование stdout дает мне ошибку, и включение библиотеки также дает ошибку. - person ZacAttack; 03.12.2011
comment
Это, казалось, был ответ в конце. Я обнаружил, что могу использовать эквивалент STDOUT_BASE_ADDR на используемой мной платформе. Я не отметил это сразу, потому что, наконец, понял, что шнур, который я использовал для подключения робота, был плохим T_T Потребовалось несколько часов, чтобы понять это. Еще раз спасибо, Керрек! - person ZacAttack; 03.12.2011
comment
Хороший. Для длинных строк это намного лучше, чем формат %c%c%c, который я использовал. - person Alex; 27.07.2017

Вместо этого используйте формат "%c%c%c".

person Sophie Alpert    schedule 03.12.2011

Вместо этого вы бы использовали fwrite. Printf по определению является принтером ascii.

char buf[] = {0x80, 0x80, 0x80};
fwrite(buf, 1, 3, stdout);

кажется, то, что вы хотите.

person Dave    schedule 03.12.2011