我正在制作一个Android应用程序+ arduino,它将从arduino接收ir代码并通过蓝牙将results.value
(ir解码)发送到android。在android方面,我已经收到代码作为一个字符串,导致(例如)92c0然后做了一个测试按钮,将其发送回arduino并触发它通过irsend.sendNEC(0x92c0, 32)
问题将ir代码发送到设备当我从Android应用程序接收代码时,我必须通过char data
接收代码,如何使用data
这是一个字符,并将其用作irsend.sendN
中的0x92c0的替代在下面草绘:
#include <IRremote.h>
#include <SoftwareSerial.h>
SoftwareSerial bluetoothPort(4,5);
const int RECV_PIN = 12;
char data = "0";
const int SEND_PIN = 13;
IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results results;
int BTval;
int IRval;
void setup()
{
bluetoothPort.begin(9600);
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop()
{
if(bluetoothPort.available() > 0)
{
data = bluetoothPort.read();
Serial.print(data);
irsend.sendNEC(operator[data],32);
irrecv.resume();
}
if(irrecv.decode(&results))
{
Serial.println(results.value);
int set = results.value;
bluetoothPort.println(results.value, HEX);
irrecv.resume();
}
}
答案 0 :(得分:0)
这里的问题是你不能将0x92c0作为char(或字节)传输。仅仅因为它不是一个字节,而是两个。
现在,我对Android并不多,所以我需要看到android代码来制作一个真正的解决方案你可以通过三种方式处理这个问题:
我告诉你最后2个,因为第1个是最有效但我认为你没有正确的知识从android发送和接收二进制格式的数据(当然我没有它)
因此,如果数据以字符串格式传输(与上传数据的方式相同),您将收到更多字节:
代码只是将您收到的字节存储在一个变量中,然后在收到CR或LF时发送它:
// Outside the loop function
uint16_t receivedData;
// Inside the loop function
if(bluetoothPort.available() > 0)
{
data = bluetoothPort.read();
if ((data >= '0') && (data <= '9'))
{ // If it is a digit between 0 and 9 (in ascii)
receivedData = (receivedData << 4) | (data - '0');
}
else if ((data >= 'A') && (data <= 'F'))
{ // If it is a digit between A and F (in ascii)
receivedData = (receivedData << 4) | (data - 'A' + 10);
}
else if ((data >= 'a') && (data <= 'f'))
{ // Lowercase case
receivedData = (receivedData << 4) | (data - 'a' + 10);
}
else if (((data == '\r') || (data == '\n')) && (receivedData > 0))
{ // I tend to consider both CR and LF, because windows always screws this
Serial.print(receivedData, HEX);
irsend.sendNEC(receivedData,32); // Not sure about the 32 here...
irrecv.resume();
receivedData = 0;
}
else
receivedData = 0; // Something went wrong, just reset the variable
}
如果您只需要发送一些代码,则可以存储它们,然后只传输正确的索引。例如:
// Outside the loop function
uint16_t possibleCodes[] = { 0x92c0, 0x8238, 0x5555 };
// Inside the loop function
if(bluetoothPort.available() > 0)
{
data = bluetoothPort.read();
// If you are using string transmission, use the following
// line to get the correct value
// data = bluetoothPort.read() - '0';
if (data < sizeof(possibleCodes) / sizeof(possibleCodes[0]))
{
Serial.print(possibleCodes[data], HEX);
irsend.sendNEC(possibleCodes[data],32); // Not sure about the 32 here...
irrecv.resume();
}
}
例如在这种情况下发送0x92c0,你必须从android发送值0。