如何通过时间间隔计算出红外编码数据?

>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 ![image.png](https://cos.easydoc.net/97929141/files/lh67snto.png) :::