Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从arduino上的传入蓝牙序列提取值_C_Bluetooth_Arduino - Fatal编程技术网

C 从arduino上的传入蓝牙序列提取值

C 从arduino上的传入蓝牙序列提取值,c,bluetooth,arduino,C,Bluetooth,Arduino,我目前正在从事一个项目,该项目涉及一个android应用程序,通过arduino控制LED条。这是通过蓝牙模块完成的。我遇到的问题是,该应用程序涉及诸如控制LED条的亮度和色调等功能。因此,当对应用程序上的任何这些组件进行更改时,会向arduino发送一个值,以便它更新这些值。发送诸如“bt+50!”之类的消息,其中前两个字母标识更改的组件(bt=亮度),“+”表示实际值的开始,“!”表示结束 我想了解如何拆分和拼接传入消息,以便首先确定更改了哪个组件,然后能够提取整数值,例如: if(mess

我目前正在从事一个项目,该项目涉及一个android应用程序,通过arduino控制LED条。这是通过蓝牙模块完成的。我遇到的问题是,该应用程序涉及诸如控制LED条的亮度和色调等功能。因此,当对应用程序上的任何这些组件进行更改时,会向arduino发送一个值,以便它更新这些值。发送诸如“bt+50!”之类的消息,其中前两个字母标识更改的组件(bt=亮度),“+”表示实际值的开始,“!”表示结束

我想了解如何拆分和拼接传入消息,以便首先确定更改了哪个组件,然后能够提取整数值,例如:

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();
        }
    }
}