Консультация № 55603
16.09.2006, 10:48
0.00 руб.
0 4 3
Здравствуйте, у меня такой вопрос: Я обращаюсь к ком порту стандартным кодом через функции CreatFile и читаю из него ReadFile. По докуметации моя железочка должна выдать мне сообщение что в ней вшито такая-то версия ПО, она мне отвечает но вместо текста я вижу 8 цифр!! Данные получаемые с железа пишу в переменную типа char и вывожу их printf("%d",text); Подскажите мне пожаста в чём дело ... Может у кого-то была аналогичная проблема... Заранее спасибо.

Обсуждение

Неизвестный
16.09.2006, 11:28
общий
это ответ
Здравствуйте, Koran!

А разве printf("%d",...) выводит не цифры?
Скорее всего вам нужен %s (если железячка возвращает C-строку).

На всякий случай полный список констант для printf:

c int or wint_t

When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.

C int or wint_t

When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.

d int Signed decimal integer.

i int Signed decimal integer.

o int Unsigned octal integer.

u int Unsigned decimal integer.

x int Unsigned hexadecimal integer, using "abcdef."

X int Unsigned hexadecimal integer, using "ABCDEF."

e double

Signed value having the form [ – ]d.dddd e [sign]ddd where d is a single decimal
digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or –.

E double

Identical to the e format except that E rather than e introduces the exponent.

f double

Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.

g double

Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.

G double

Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).

n

Pointer to integer Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument.

p

Pointer to void Prints the address of the argument in hexadecimal digits.

s String

When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.

S String

When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.

Неизвестный
16.09.2006, 15:00
общий
это ответ
Здравствуйте, Koran!
А как вы вообще читаете? Если уж вы char передаете ф-ии printf и ставите ей %d, что означает число. Причем размера не 1 байт, а больше. А char занимает обычно 1 байт. По идее, на вас очень сильно должен ругаться компилятор. Ну хотя бы предупреждение выдавать. Можно, конечно, читать через char в цикле, но такой способ по-моему, неудобен и не быстр.
В общем, либо читаете сразу все в char* text и выводите с помощью printf("%s", text), либо по одному символу через char text и выводите с помощью printf("%c", text).

Приложение:
char text[128];unsigned long nBytesRead;if (ReadFile(hFile, &text, 128, &nBytesRead, NULL) && (nBytesRead == 0)) { printf ("%s", text);}else printf ("Some error is occured.\n");//////////////////char textunsigned long nBytesRead;while (ReadFile(hFile, &text, 1, &nBytesRead, NULL) && (nBytesRead == 0)) { printf ("%c", text);}else printf ("Some error is occured.\n");
Неизвестный
17.09.2006, 23:52
общий
Ребята, спасибо за помощь, но не помогает.. Если я пишу как советует мне Кирилл (text[128]) то он вообще ничего не выводит.. ни ошибки - ни сообщения. Вторым способом.. выводит абру-кадабру.. Я приведу кусок программы - может так вы мне поможеье.. Заранее спасибо..DWORD iSize; char text; while(true) { ReadFile(hCom,&text,1,&iSize,0); printf("%c",text); }
Неизвестный
19.09.2006, 10:26
общий
это ответ
Здравствуйте, Koran!

Попробуйте с Вашим кодом, но обратите внимание на то что цикл у Вас
бесконечный, надо организовать выход.
Например, если нет данных в приемном буфере, или считано нужное Вам количество байт, или исползовать тайм-ауты
(см. BOOL SetCommTimeouts( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeout):

DWORD iSize;
char text;
while(true)
{
if( ReadFile(hCom,&text,1,&iSize,0) && iSize > 0 )
printf("%c",text);
}

Можно так попробовать:

char buf[128];
DWORD iSize;

while ( ReadFile(hCom, buf, 127, &iSize, NULL) && (iSize > 0) )
{
//добавим признак конца строки, на всякий случай ;)
text[iSize] = 0;
printf ("%s", text);
}
printf ("\nEnd of message.\n");

До начала цикла в порт уже должны поступить данные,
а то сразу проскочит ничего не приняв.

Возмжно поздновато отвечаю, но только сегодня поучил вопрос.
Удачи.
Форма ответа