Отправить преобразованную температуру DS1820 через PIC16 uart

Я пытаюсь отправить преобразованное значение температуры с моего DS1820 на свой компьютер, используя UART PIC16F877. Я использую MPLABX и компилятор XC8, который имеет сборку в usart.h, хотя он полезен только для серии PIC18, поэтому я использую usart_pic16.h, который был написан третьей стороной для работы с серией PIC16.

Я успешно собираю температуру в шестнадцатеричной форме с DS1820 и преобразовываю ее в удобочитаемое число с плавающей запятой, но я не могу найти способ передать значение с плавающей запятой на ПК через UART.

Библиотека usart_pic16.h позволяет напрямую отправлять символы, строки, строки и целые числа через usart, используя следующие методы:

  • недействительными USARTWriteChar (char ch);
  • недействительными USARTWriteString (const char *str);
  • недействительными USARTWriteLine (const char *str);
  • недействительными USARTWriteInt (int16_t val, int8_t field_length);

Я застрял в поиске способа отправки значения с плавающей запятой через UART с помощью этой библиотеки, которая включает извлечение и отправку десятичной точки.

Я попытался отправить такую ​​​​строку: -

  • USARTWriteString("TempC=%7.3f градусов C \r\n", temp_c );

Где temp_c — это значение с плавающей запятой для temp, но при компиляции возникло сообщение об ошибке «слишком много аргументов функции». Вероятно, очевидно для тех гуру c, которыми я, к сожалению, не являюсь :(

Возможно, одним из способов было бы извлечь каждое значение из числа с плавающей запятой и отправить его как int, за исключением десятичной точки, которую, вероятно, можно было бы найти с проверкой «если» для каждого значения, а затем, когда десятичная точка будет найдена, просто отправьте это как символ, например USARTWriteChar('.');, который действительно работает. К сожалению, я не знаю, как извлечь отдельные значения с плавающей запятой или это лучший способ сделать это.

Я не был уверен, нужен ли мой код для решения этой проблемы, поэтому решил не рассылать его спамом, если кто-то не спросит.

Любая помощь будет здорово.

Спасибо.


person Markus    schedule 05.02.2014    source источник


Ответы (1)


Общим эквивалентом было бы включить <stdio.h> и сделать что-то вроде следующего:

char s[64];
sprintf(s, "TempC= %7.3f degrees C \r\n", temp_c);
USARTWriteString(s);

Хотя для встраиваемой платформы вам, возможно, лучше избегать функций стиля printf, которые могут использовать довольно много места для кода на небольшом микроконтроллере. Также в приведенном выше примере имеет смысл разбить только преобразование с плавающей запятой на отдельный sprintf и вывести остальную часть строки отдельно, чтобы буфер s не был таким большим.

Это должно заставить вас работать на данный момент, но в более долгосрочной перспективе вы, возможно, захотите посмотреть на преобразование температуры в целое число, скажем, умножив его на 1000, а затем расшифровав значение на ПК, это предполагает, что в конечном итоге вы собираетесь написать свое собственное приложение для связь с микроконтроллером.

person PeterJ    schedule 05.02.2014
comment
Вот и все, большое спасибо за помощь и быстрый ответ. Возможно, со временем я посмотрю на поток, выстраивающий код, но пока я просто наслаждаюсь движением вперед :). С Уважением. - person Markus; 05.02.2014