通过PIC16 uart发送转换后的DS1820温度

时间:2014-02-05 11:00:56

标签: c pic mplab usart

我正在尝试使用PIC16F877 uart将DS1820的转换温度读数发送到我的PC。我使用的是MPLABX和XC8编译器,它有一个usart.h版本,虽然它只对PIC18系列有用,所以我使用的是usart_pic16.h,它是由第三方编写的,用于PIC16系列。

我正在从DS1820成功收集其十六进制形式的温度并将其转换为人类可读的浮点数,但我找不到通过UART将浮点值转发到PC的方法。

usart_pic16.h库允许使用以下方法直接在usart上发送字符,字符串,行和整数: -

  • void USARTWriteChar(char ch);
  • void USARTWriteString(const char * str);
  • void USARTWriteLine(const char * str);
  • void USARTWriteInt(int16_t val,int8_t field_length);

我一直在寻找一种方法来使用这个库在uart上发送浮点值,包括提取和发送小数点。

我尝试发送这样的字符串: -

  • USARTWriteString(“TempC =%7.3f℃C \ r \ n”,temp_c);

其中temp_c是temp的浮点值,但在编译时错误地使用“太多函数参数”。那些c大师可能很明显,我很遗憾没有:(

也许有一种方法是从float中提取每个值并将其作为int发送,但小数点除外,这可能通过对每个值进行'if'检查找到,然后当小数点为发现只是发送它作为一个char例如USARTWriteChar('。');,确实有效。不幸的是,我不知道如何提取单个浮点数值,或者它是否是最好的方法。

我不确定我的代码是否需要解决这个问题所以我认为除非有人问,否则我会避免发送垃圾邮件。

任何帮助都会很棒。

感谢。

1 个答案:

答案 0 :(得分:2)

一般的等价物包括<stdio.h>并执行以下操作:

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

虽然对于嵌入式平台,您最好避免使用printf样式函数,这些函数可以在小型微控制器上使用相当多的代码空间。同样在上面的例子中,将浮点转换分解为单独的sprintf并分别输出字符串的其余部分以使缓冲区s不必如此大。 / p>

这应该让你暂时运行,但从长远来看,你可能想看看将温度转换为整数,然后将其乘以1000然后解码PC上的值,这假设最终你打算编写你的自己的应用程序与微控制器通信。