【问题标题】:Arduino unsigned long int to char*Arduino unsigned long int 到 char*
【发布时间】:2016-05-14 15:16:14
【问题描述】:

我正在使用定制的 IRremote 和 SSD1306 库在 Attiny85 上进行编码。

接收 IR 数据时,结果以这种方式存储:

unsigned long                 value     // Decoded value, max 32 bits
volatile unsigned int         *rawbuf   // Raw interval in 50uS ticks
int                           rawlen    // Number of records in rawbuf

OLED显示屏相关功能有:

void printChar                (char ch)
void printString              (char* pText)

我正在努力将接收到的 IR 值打印到 OLED SSD1306 屏幕。用户能够查看接收到的代码并将其保存到 EEPROM,因此我尝试了所有不同的转换,但我无法以显示接收到的 HEX 代码的方式将 results.value 打印到屏幕上(例如 0xE0E040BF,即三星电视开机)。

由于 attiny85 中的 Serial 滞后,我不知道如何调试它并使其正常工作。有什么帮助吗?

编辑(添加相关代码):

#include "SSD1306.h"
#include "IRremote.h"
...
if (irrecv.decode(&results)) {  
    dumpCode(&results);        
    irsend.sendRaw(buff, results.rawlen, 38);
    oled.printString("Received IR");
    // Print received hexadecimal IR code to the OLED screen
    irrecv.enableIRIn();    
    irrecv.resume();   
}

【问题讨论】:

  • 什么是挥发性的?使用volatile
  • 修正输入错误,易失(非易变)
  • 您应该显示一个包含相关代码的 sn-p。然后可以准确地看出你的问题出在哪里。它可能与volatile 类型的属性有关,因为根据定义,它们通常与外部进程相关联,例如嵌入式微控制器,并且可以随时更改。

标签: c++ c arduino embedded


【解决方案1】:

如果我理解正确,您只是想将unsigned long 值转换为十六进制字符串,您可以为此目的使用sprintf (ideone):

const unsigned int BUFFER_LENGTH = 16;
char buffer[BUFFER_LENGTH];
unsigned long value = 0xE0E040BF;
sprintf(buffer, "0x%08X", value);
printf("%s\n", buffer); // printString(buffer)

这样你就可以将buffer传递给oled屏幕的printString方法。

格式说明符%08X 指示 printf 将值作为一个十六进制数字传递给format,大写字母始终显示 4 个字节的所有 8 个十六进制值并用 0 填充。

【讨论】:

  • 这似乎可以解决打印问题,但由于某种原因,数据必须不匹配,格式或长度不同。接收到的 IR 代码可以使用 sendRaw(打开电视电源)重新发送,但 OLED 上的打印值不是预期值。
  • 可能与字节序有关?请查看:en.wikipedia.org/wiki/Endianness
  • 您的实现需要长度修饰符“l”来正确处理长,即“0x%08lx”
【解决方案2】:

你可以这样做:

int IR;
char hexadec_s[11];
sprintf(hexadec_s,"0x%08x",IR);
printString(hexadec_s);

我相信这应该可以解决问题。让我知道它是否有效。

【讨论】:

  • 看来我迟到了 4 分钟 xD
  • 这似乎可以解决打印问题,但由于某种原因,数据必须不匹配,格式或长度不同。接收到的 IR 代码可以使用 sendRaw(打开电视电源)重新发送,但 OLED 上的打印值不是预期值。
  • 如果您的printString 实施良好,这应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2013-10-16
相关资源
最近更新 更多