C 从arduino上的传入蓝牙序列提取值
我目前正在从事一个项目,该项目涉及一个android应用程序,通过arduino控制LED条。这是通过蓝牙模块完成的。我遇到的问题是,该应用程序涉及诸如控制LED条的亮度和色调等功能。因此,当对应用程序上的任何这些组件进行更改时,会向arduino发送一个值,以便它更新这些值。发送诸如“bt+50!”之类的消息,其中前两个字母标识更改的组件(bt=亮度),“+”表示实际值的开始,“!”表示结束 我想了解如何拆分和拼接传入消息,以便首先确定更改了哪个组件,然后能够提取整数值,例如:C 从arduino上的传入蓝牙序列提取值,c,bluetooth,arduino,C,Bluetooth,Arduino,我目前正在从事一个项目,该项目涉及一个android应用程序,通过arduino控制LED条。这是通过蓝牙模块完成的。我遇到的问题是,该应用程序涉及诸如控制LED条的亮度和色调等功能。因此,当对应用程序上的任何这些组件进行更改时,会向arduino发送一个值,以便它更新这些值。发送诸如“bt+50!”之类的消息,其中前两个字母标识更改的组件(bt=亮度),“+”表示实际值的开始,“!”表示结束 我想了解如何拆分和拼接传入消息,以便首先确定更改了哪个组件,然后能够提取整数值,例如: if(mess
if(message_id == 'bt'){
brightness = message_value;
}
目前,我只是测试出一个正常的单色LED灯的东西。我只实现了一个非常简单的代码,它可以处理来自蓝牙串口的单字母消息
我曾尝试过使用内置的C字符串函数,但由于我对C语言不熟悉,而且我有python背景,所以很难让这些函数正常工作
// Bluetooth module used - HC-06
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(5, 6); // (TXD, RXD) of HC-06
char BT_input; // to store input character received via BT.
void setup()
{
pinMode(13, OUTPUT); // Arduino Board LED Pin
BlueTooth.begin(9600);
}
void loop()
{
if (BlueTooth.available())
{
BT_input=(BlueTooth.read());
if (BT_input=='n')
{
digitalWrite(13, HIGH);
BlueTooth.println("Now LED is ON");
}
else if (BT_input=='f')
{
digitalWrite(13, LOW);
BlueTooth.println("Now LED is OFF");
}
}
}
//使用蓝牙模块-HC-06
#包括
软件串行蓝牙(5,6);//HC-06的(TXD,RXD)
字符BT_输入;//存储通过BT接收的输入字符。
无效设置()
{
引脚模式(13,输出);//Arduino板LED引脚
蓝牙开始(9600);
}
void循环()
{
if(BlueTooth.available())
{
BT_输入=(BlueTooth.read());
如果(BT_输入=='n')
{
数字写入(13,高);
BlueTooth.println(“现在LED亮起”);
}
else if(BT_输入='f')
{
数字写入(13,低);
BlueTooth.println(“现在LED熄灭”);
}
}
}
我希望从传入的消息中提取消息id和消息值,以便能够更新我的LED条。您可以使用
字符串
变量,该变量将所有读取的值存储到其中,并且一次代码>被读取,它将开始处理它
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(5, 6); // (TXD, RXD) of HC-06
char input; // to store input character received via BT.
String data;
void setup()
{
pinMode(13, OUTPUT); // Arduino Board LED Pin
BlueTooth.begin(9600);
}
void loop()
{
if (BlueTooth.available())
{
input=(BlueTooth.read());
if (input != '!') {
data += input;
}
else{
String message_id = String(data.substring(0,2)); //gets only "bt"
data.remove(0,3); //data becomes "50" since '!' is not added to data
int message_value = data.toInt();
if(message_id == "bt"){
brightness = message_value;
}
}
}
}
#包括
软件串行蓝牙(5,6);//HC-06的(TXD,RXD)
字符输入;//存储通过BT接收的输入字符。
字符串数据;
无效设置()
{
引脚模式(13,输出);//Arduino板LED引脚
蓝牙开始(9600);
}
void循环()
{
if(BlueTooth.available())
{
输入=(BlueTooth.read());
如果(输入!=“!”){
数据+=输入;
}
否则{
String message_id=String(data.substring(0,2));//只获取“bt”
data.remove(0,3);//由于未将“!”添加到数据中,因此数据变为“50”
int message_value=data.toInt();
如果(消息_id==“bt”){
亮度=信息值;
}
}
}
}
您可以使用一种典型的技巧,将多字节字符文本编码为单个无符号int
,在Arduino uno和Mega 2560上是16位的小端格式
参考C标准ISO/IEC 9899:201x§“6.4.4.4字符常数”
第10分段解释了我们的情况:
整数字符常量的类型为int。整数的值
字符常量,其中包含映射到
单字节执行字符是
被解释为整数的映射字符的表示形式。这个
包含多个字符的整数字符常量的值
字符(例如,“ab”),或包含字符或转义序列
不映射到单字节执行字符的
已定义实施。如果整数字符常量包含
单个字符或转义序列,其值是结果
当一个char类型的对象的值是单个
字符或转义序列转换为int类型
我们案例中的“实施定义”如下所述进行管理
在这种情况下,多字节字符常量'bt'
可以编码为16位整数0x6274
,其中'b'=0x62
和't'=0x74
编译器还应该足够聪明,能够转换int值中的多字节字符序列
在下面的代码段中,我们认为CHARAR数组<代码> MSG保存所接收的消息,并且我们使用一个简单的、功能性的<代码>开关语句(它需要一个整数值)将<代码> MSG变量转换成一个无符号整数。
char msg[10];
...
switch (*((unsigned int *)msg))
{
case 'tb': //Note the reverse order of command characters due to endianess
int value = atoi(msg+2); //Convert number to int
.... //do something
break;
.... //other cases
}
将msg
pointer变量转换为指向无符号整数的指针,编译器将以上面解释的方式将前2个字符解释为整数,并根据其值执行开关
下面的示例使用为使用开关而修改的代码。它假定该命令的固定长度等于MAX\u MSG\u LEN
(2个字符表示命令,2个字符表示值和消息结尾):
//使用蓝牙模块-HC-06
#包括
软件串行蓝牙(5,6);//HC-06的(TXD,RXD)
#定义最大消息长度5//最大消息长度
#定义偏移量到值//输入缓冲区中的偏移量到值
字符BT_输入[10];//存储通过BT接收的输入字符。
无效设置()
{
引脚模式(13,输出);//Arduino板LED引脚
蓝牙开始(9600);
}
void循环()
{
if(BlueTooth.available())
{
/*
*把信息读到“!”
*/
int i=0;
做
{
BT_输入[i]=(BlueTooth.read());
}(IARDUINO是C++,而不是C是一个慢的C++解决方案,它的STD::字符串足够或必须用C字符串来完成吗?希望有一个恶心的建议!希望我有多个下限投票选项。1。编译器允许<代码>外壳BT:< /Cord>这个?2。略微仁慈。3。<代码> *((无符号int *))由于严格的别名,msg
是未定义的行为
// Bluetooth module used - HC-06
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(5, 6); // (TXD, RXD) of HC-06
#define MAX_MSG_LEN 5 //Max message length
#define OFFSET_TO_VALUE //Offset in input buffer to value
char BT_input[10]; // to store input characters received via BT.
void setup()
{
pinMode(13, OUTPUT); // Arduino Board LED Pin
BlueTooth.begin(9600);
}
void loop()
{
if (BlueTooth.available())
{
/*
* Read in the message up to the '!'
*/
int i=0;
do
{
BT_input[i] = (BlueTooth.read());
} while (i<MAX_MSG_LEN && BT_input[i++]!='!');
/*
* If message length is exactly what we expect
* we can process the message.
* Note that because of endianess the command
* chare are rversed.
*/
if (i == MAX_MSG_LEN)
{
switch (*((unsigned int *)BT_input))
{
case 'tb': // command 'bt'
process_brigthness(atoi(BT_input + OFFSET_TO_VALUE));
break;
case 'no': // command 'on'
{
digitalWrite(13, HIGH);
BlueTooth.println("Now LED is ON");
break;
}
case 'fo': // command 'of' for off
{
digitalWrite(13, LOW);
BlueTooth.println("Now LED is OFF");
break;
}
default: // unknown command
{
unknown_command();
break;
}
}
}
else
{
/*
* Process communication error
*/
communication_error();
}
}
}
// Bluetooth module used - HC-06
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(5, 6); // (TXD, RXD) of HC-06
#define MAX_MSG_LEN 5 //Max message length
#define OFFSET_TO_VALUE //Offset in input buffer to value
union tag_BT_input // to store input characters received via BT.
{
char stream[MAX_MSG_LEN];
struct
{
unsigned int cmd; //Command
char val[2]; //value
char eom; //End of message marker '!'
}msg;
} BT_input;
void setup()
{
pinMode(13, OUTPUT); // Arduino Board LED Pin
BlueTooth.begin(9600);
}
void loop()
{
if (BlueTooth.available())
{
/*
* Read in the message up to the '!'
*/
int i=0;
do
{
BT_input.stream[i] = (BlueTooth.read());
} while (i<MAX_MSG_LEN && BT_input.stream[i++]!='!');
/*
* If message length is exactly what we expect
* we can process the message.
* Note that because of endianess the command
* chare are rversed.
*/
if (i == MAX_MSG_LEN)
{
switch (BT_input.msg.cmd)
{
case 'tb': // command 'bt'
process_brigthness(atoi(BT_input.msg.val));
break;
case 'no': // command 'on'
{
digitalWrite(13, HIGH);
BlueTooth.println("Now LED is ON");
break;
}
case 'fo': // command 'of' for off
{
digitalWrite(13, LOW);
BlueTooth.println("Now LED is OFF");
break;
}
default: // unknown command
{
unknown_command();
break;
}
}
}
else
{
/*
* Process communication error
*/
communication_error();
}
}
}