【问题标题】:passing char and float value to a string将 char 和 float 值传递给字符串
【发布时间】:2018-10-02 15:39:46
【问题描述】:

我需要使用字符串发送 get 请求,因此我需要将 float 和 char 值传递给字符串以便发送它。我正在尝试使用 ESP8266 模块将 PIC18F4550 连接到 wifi 我还需要读取和写入数据库。我一直在使用我制作的这个功能来发送 AT 命令并且它工作正常:

void send (char dato[]){
    int i = 0;
    while (dato[i]!=0){
        TXREG=dato[i];
        i++;
        while(TRMT==0);
    }
    TXREG = 0x0D; 
    while(TRMT==0);
    TXREG = 0x0A;
}

我的问题是我需要发送:

send("GET /ESPic/index3.php?temp=temp&luz=luz");

但是 luz 是 char 而 temp 是 float。使用 FTDI232 和 Arduino IDE 我正在读取 PIC 和 ESP8266 之间的数据。我真的不知道该怎么做。

【问题讨论】:

  • 请正确缩进您的代码。 luztemp 在你的代码中在哪里?
  • 你可以在传输之前用sprintf构建消息字符串吗?此外,代码缺少初始或最终状态检查。
  • 请注意,您可能必须在交叉编译器中启用printf 函数系列。另请参阅Using floats with sprintf() in embedded C

标签: c pic


【解决方案1】:

假设你的平台支持sprintf,你可能想要这个:

float temp;
char luz;
...
char buffer[200];
sprintf(buffer, "GET /ESPic/index3.php?temp=%f&luz=%c", temp, luz);
send(buffer);

【讨论】:

  • 如果 temp 的值为 37.5 而 luz 的值为 0,那么缓冲区的长度是多少?我需要它用于send("AT+CIPSEND=AA"),其中 AA 是长度
  • 使用 strlen(buffer) 获取缓冲区的长度。在您的 CIPSEND=AA 中,如果需要,AA 是否总是带有前导零的 2 个字符?请注意,C 中的前导零表示八进制。
  • 缓冲区将被 NUL 终止。阅读 C 教科书中处理字符串的章节。
【解决方案2】:

首先将float 转换为字符串


发送float 的文本版本时,最好避免使用"%f",并使用"%e""%g""%a" 并具有足够的精度。

"%f" 对于大数字可能很长。对于大约一半的float(小的),它会转换为无意义的 +/- "0.000000"

e,g,a 这 3 种格式对最大长度有更好的控制,更容易确保使用所需的精度。

float temp;
char luz;
// send("GET /ESPic/index3.php?temp=temp&luz=luz");

#define SEND_FC_FMT "GET /ESPic/index3.php?temp=%.*e&luz=%c"
//                     -   d   .    ddd...ddd            e   - d...d \0 
#define FLT_ESTR_SIZE (1 + 1 + 1 + (FLT_DECIMAL_DIG-1) + 1 + 1 + 5 + 1)
char buffer[sizeof SEND_FC_FMT + FLT_ESTR_SIZE];

sprintf(buffer, SEND_FC_FMT, FLT_DECIMAL_DIG-1, temp, luz);
send (buffer);

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多