IRリモートメッセージを作成するために、符号なしint配列を作成する必要があります。これを行うには、ヘッダーをデータビットに連結しなければなりません。どのキーを模倣するかによって異なります。 は、ここで私が持っているものだと問題:Cの符号なしint配列のコピー
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const unsigned HEADER[34] = {4608, 4398, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472};
unsigned short BTN_VOL_UP = 0xE01F;
void intToBin(unsigned short a, char* buffer) {
buffer += 15;
int i = 15;
for (i; i >= 0; i--) {
*buffer-- = (a & 1) + '0';
a >>= 1;
}
}
void hexToData(unsigned** data, int code) {
char* strHex = (char*) malloc(16 * sizeof(char));
intToBin(code, strHex);
int i = 0;
for(i; i < 16; i++) {
char c = strHex[i];
*(*data)++ = 655;
if (c == '1') {
*(*data)++ = 1588;
} else {
*(*data)++ = 472;
}
}
(*data) -= 32;
}
void getCode(unsigned** data, short code) {
int i = 0;
for (i; i < 34; i++) {
*(*data)++ = HEADER[i];
}
unsigned* bits = (unsigned*) malloc(32 * sizeof(unsigned));
hexToData(&bits, code);
i = 0;
for (i; i < 32; i++) {
*(*data)++ = bits[i];
}
*(*data)++ = 647;
*(*data)++ = 0;
(*data) -= 68;
}
そして、ここでは、このすべてを呼び出すコードです:その後
unsigned* data = (unsigned*) calloc(68, sizeof(unsigned));
getCode(&data, BTN_VOL_UP);
を、私は(それぞれの値を印刷するために使用して)ヘッダを印刷し、データ変数は、それは私が得るものです:
4608 4398 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472
0 136 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 655 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 1588 655 1588 647 0 16
HEADERは正しいですが、データが完全に間違っています:データのヘッダーは完全に間違っています。実際のデータ部分(VOL_UPコード)は正しいですが、最後に余計な値はありません。そこに:16.配列は... 647、0}で終わるはずです。
コードに問題がありますか?
編集:私はこの問題を発見し、修正を含むコードを編集しました。 値をコピーする正確な場所を見つけるのに問題があることがわかったので、intでintを手動でコピーし、最後にポインタを減算することにしました。醜いですが、それは動作します。
ここで尋ねる代わりに、それをデバッグするだけの理由はありませんか? –
私はArduinoでこれをやっているので、簡単にデバッグできるとは思いません。 –
WindowsやLinuxでデバッグすることもできますが、デバイス依存のプログラムではありません。 –