如何通过时间间隔计算出红外编码数据?
>s基于红外学习模块,如何通过时间数据最终转化为<span style="color:red">红外编码数据</span>,组成外码发射指令,下面分享一份基于<span style="color:red">C语言</span>实现的示例代码,基于<span style="color:red">QT平</span>台的:
```java
#include <QCoreApplication>
#include <QDebug>
//返回值枚举
typedef enum {
RES_OK = 0,
RES_FAIL,
RES_ERROR,
RES_NO_SPACE,
} ReturnStatus;
typedef struct {
uint8_t dat[1024];
uint16_t len;
} Buffer;
//计算校验和
uint8_t GetSum(uint8_t *dat, uint16_t len) {
uint8_t sum = 0;
uint16_t i;
for (i = 0; i < len; i++) {
sum += dat[i];
}
return sum;
}
//长度转uint8_t数组
uint16_t LengthToChar(uint8_t *dat, uint32_t len) {
uint8_t ret = 1;
if (len < 128) {
dat[0] = (uint8_t)len;
}
else if (len < 16384) {
dat[0] = (uint8_t)(len % 128) | 0x80;
dat[1] = (uint8_t)(len >> 7);
ret += 1;
}
else {
dat[0] = (uint8_t)(len % 128) | 0x80;
dat[1] = (uint8_t)(len >> 7) | 0x80;
dat[2] = (uint8_t)(len >> 14);
ret += 2;
}
return ret;
}
//获取红外外码发射指令帧
uint8_t GetStgData(Buffer *p, uint32_t *data, uint8_t len) {
uint8_t *offset = p->dat, i, j, ret, tmp[4], check;
//帧头
*offset++ = 0x68;
offset += 2;
//模块地址
*offset++ = 0xff;
//功能码
*offset++ = 0x22;
//数据域
for (i = 0; i < len; i++) {
//把时间转化为字节流数据
ret = LengthToChar(tmp, data[i] / 8);
for (j = 0; j < ret; j++) {
*offset++ = tmp[j];
}
}
check = GetSum(&p->dat[3], offset - p->dat - 3);
*offset++ = check;
*offset++ = 0x16;
p->len = offset - p->dat;
p->dat[1] = (uint8_t)p->len;
p->dat[2] = (uint8_t)(p->len >> 8);
return RES_OK;
}
//打印16进制
void PrintHex(uint8_t *dat, uint16_t len) {
char *p, *offset;
uint16_t i;
p = new char[len * 3 + 1];
if (p == NULL) {
return;
}
offset = p;
for (i = 0; i < len; i++) {
sprintf(offset, "%02X ", dat[i]);
offset += 3;
}
*offset = 0;
qDebug("%s", p);
delete p;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Buffer buf;
uint32_t timePeriod[] = {9000, 4500};
uint8_t res = GetStgData(&buf, timePeriod, sizeof(timePeriod) / sizeof(uint32_t));
if (res == RES_OK) {
PrintHex(buf.dat, buf.len);
}
return a.exec();
}
```
运行结果截图:
::: hljs-center

:::