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

Posted

技术标签:

【中文标题】通过 PIC16 UART 发送转换后的 DS1820 温度【英文标题】:Send converted DS1820 temperature over PIC16 uart 【发布时间】:2014-03-01 18:30:47 【问题描述】:

我正在尝试使用 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 摄氏度 \r\n", temp_c );

其中 temp_c 是 temp 的浮点值,但在编译时出现“函数参数过多”的错误。对于那些 c 大师来说可能很明显,不幸的是我不是:(

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

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

任何帮助都会很棒。

谢谢。

【问题讨论】:

【参考方案1】:

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

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

尽管对于嵌入式平台,您最好避免使用printf 风格的函数,因为它们会在小型微控制器上使用相当多的代码空间。同样在上面的示例中,将浮点转换分解为单独的 sprintf 并单独输出字符串的其余部分是有意义的,因此缓冲区 s 不必那么大。

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

【讨论】:

大功告成,非常感谢您的帮助和快速响应。我最终可能会考虑对代码进行流式处理,但现在我只是喜欢继续前进:)。问候。

以上是关于通过 PIC16 UART 发送转换后的 DS1820 温度的主要内容,如果未能解决你的问题,请参考以下文章

PIC18f46k42 UART没有收到

Visual Studio 2013 SerialPort未接收所有数据

具有高波特率循环缓冲器的 PIC 中断驱动 UART

c_cpp UART PIC

从蓝牙设备从 pic18f4525 上的 RCREG 读取数据

DSP之通信之异步串口