通过蓝牙android发送和接收字符串值

通过蓝牙android发送和接收字符串值,android,string,bluetooth,send,Android,String,Bluetooth,Send,我正在开发一个应用程序,需要通过蓝牙向PCB发送3个seekbar值。我已经完成了基于bluetoothchat示例的所有蓝牙代码。我首先修改它来发送一个包含这3个值的字符串。但是现在,我需要做一些更困难的事情,我不知道怎么做 首先,在应用程序中,我修改搜索栏,然后单击发送按钮。在代码中,我需要为每个seekbar的值设置一个字符串,因为我需要访问MCU变量并设置每个变量的地址、值、CRC等 所以,我需要知道正确的方法。下面是我定义send函数的代码: /** * SEND THREAD *

我正在开发一个应用程序,需要通过蓝牙向PCB发送3个seekbar值。我已经完成了基于bluetoothchat示例的所有蓝牙代码。我首先修改它来发送一个包含这3个值的字符串。但是现在,我需要做一些更困难的事情,我不知道怎么做

首先,在应用程序中,我修改搜索栏,然后单击发送按钮。在代码中,我需要为每个seekbar的值设置一个字符串,因为我需要访问MCU变量并设置每个变量的地址、值、CRC等

所以,我需要知道正确的方法。下面是我定义send函数的代码:

/**
 * SEND THREAD
 */
/**[Start Thread + Send command + Nº bytes thread + Nº bytes variable + Address + Variable value + CRC]*/

public void sendValues() {

    /**Set the seekbars values into a string*/
    send_value1 = Integer.toString(savedProgress1);
    send_value2 = Integer.toString(savedProgress2);
    send_value3 = Integer.toString(savedProgress3);



    String message1 = start_thread+" "+send_command+" "+num_byte_trama1+ " "+num_byte_variable+" "+pos_reg_1+" "+Value+" "+CRC;
    String message2 = start_thread+" "+send_command+" "+num_byte_trama1+ " "+num_byte_variable+" "+pos_reg_2+" "+Value+" "+CRC;
    String message3 = start_thread+" "+send_command+" "+num_byte_trama1+ " "+num_byte_variable+" "+pos_reg_3+" "+Value+" "+CRC;
    String message4 = start_thread+" "+send_command+" "+num_byte_trama2+ " "+num_byte_variable+" "+pos_reg_save_request+" "+Value+" "+CRC;
    String message5 = start_thread+" "+send_command+" "+num_byte_trama2+ " "+num_byte_variable+" "+pos_reg_save_status+" "+Value+" "+CRC;



    /**Check that we're actually connected before trying anything*/
    if (GlobalVar.mTransmission.getState() != GlobalVar.STATE_CONNECTED) {
        Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
        return;
    }

    /**Get the message bytes and tell the Transmission to write*/
    byte[] send = message.getBytes();
    GlobalVar.mTransmission.write(send);

    /**Reset out string buffer to zero*/
    GlobalVar.mOutStringBuffer.setLength(0);
}
我请你帮我做以下几件事:

1- Need to know how to calculate the CRC
2- I need to send these 5 strings together when pressing the send button. 
在我获取要发送的字节的部分,我不知道正确的方法是在1上添加这5个字符串并发送这个字符串(如果我这样做,可能会太长),还是创建一个函数来单独但同时发送这5个字符串

这是编辑后的代码,用于逐个发送每条消息:

    /**Conversion to decimal of the seekbar's % value*/
    send_int1 = ((savedProgress1 * 20480) / 100) * -1;
    send_int2 = ((savedProgress2 * 20480) / 100) * -1;
    send_int3 = ((savedProgress3 * 20480) / 100) * -1;

    /**Conversion to string of the previous values to send in the string message*/
    sendValue1 = Integer.toString(send_int1);
    sendValue2 = Integer.toString(send_int1);
    sendValue3 = Integer.toString(send_int1);


    String message1 = start_thread+" "+send_command+" "+num_byte_trama1+" "+num_byte_variable+" "+pos_reg_1+" "+sendValue1+" " ;
    String message2 = start_thread+" "+send_command+" "+num_byte_trama1+" "+num_byte_variable+" "+pos_reg_2+" "+sendValue2+" " ;
    String message3 = start_thread+" "+send_command+" "+num_byte_trama1+" "+num_byte_variable+" "+pos_reg_3+" "+sendValue3+" " ;
    String message4 = start_thread+" "+send_command+" "+num_byte_trama2+" "+num_byte_variable+" "+pos_reg_save_request+" " ;
    String message5 = start_thread+" "+send_command+" "+num_byte_trama2+" "+num_byte_variable+" "+pos_reg_save_status+" " ;



    /**Check that we're actually connected before trying anything*/
    if (GlobalVar.mTransmission.getState() != GlobalVar.STATE_CONNECTED) {
        Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
        return;
    }

    /**Get the message bytes and tell the Transmission to write*/
    byte[] send1 = message1.getBytes();
    GlobalVar.mTransmission.write(send1);

    //Wait untill I receive the confirmation from the MCU

    byte[] send2 = message2.getBytes();
    GlobalVar.mTransmission.write(send2);

    byte[] send3 = message3.getBytes();
    GlobalVar.mTransmission.write(send3);

    byte[] send4 = message4.getBytes();
    GlobalVar.mTransmission.write(send4);

    byte[] send5 = message5.getBytes();
    GlobalVar.mTransmission.write(send5);


    /**Reset out string buffer to zero*/
    GlobalVar.mOutStringBuffer.setLength(0);
}

对于您的框架,我建议您使用这种框架:

final byte[]HEADER=AA11//例如
//当您要发送消息时:
Strign messageToSend=新字符串(标题)+yourStringMessage

当您收到帧时,您将更容易分析帧

那么,对于CRC,如果你不告诉我CRC的类型,我无法回答。在我的应用程序中,我使用

private static char createCRC(byte[] frame)
{ 
    int crc = 0;
    for(byte i : frame)
    {
        crc = crc^i;
    }
   return (char)crc;
}
通过“XORing”消息的每个字节来创建CRC,然后检查CRC是非常容易的

更新:我终于明白了

在BluetoothChat活动中,您将获得消息的字符串版本,以及字节[]1。 如果要获取消息的第一个字节,只需在
String readMessage=new String(readBuf,0,msg.arg1)之前添加
byte myByte=readBuf[0]

然后,
stringreadmessage=新字符串(myByte,0,msg.arg1)

这是什么类型的CRC?如果您想在同一帧中发送所有数据,可以只发送do
String stringToSend=message1+message2+message3+message4+message5
,但我认为这不是最好的主意。当我必须发送蓝牙帧时,我更喜欢使用标题,如
11AA
,然后发送帧长度,然后发送帧内容。有了它,你将更容易捕捉到一个新的画面。我正在考虑一个接一个地发送每条信息。我先发送第一个,等到收到确认后再发送下一个。我需要计算的CRC用于以下变量:{send_comand,num_byte_trama,num_byte_variable,pos_reg,value}。所以,我需要创建一个函数,计算每条消息的这些变量的CRC。请帮帮我。是的,但这是哪种CRC?16 ? 我真的不知道如何计算CRC或者我需要什么样的CRC。我刚刚开始在android上编程这个项目。我的合作伙伴制作了MCU的软件,他不知道自己在计算什么样的CRC。他只是告诉我,我必须对这些变量的字节求和,然后转换成十六进制。关于字符串消息发送,我感谢您的建议,但我不知道舒尔如何发送,因此我将首先尝试我的方法。我想问的是:例如,当我发送消息1时,MCU向我发送响应。我需要知道如何获得此响应并阅读它,它将类似于{2b 00},中间的00是我需要确认它已正确发送并继续发送消息2的地方。我正在使用bluetoohchat示例中为这个目的而修改的代码,但是我找不到在AcepThread中读取响应变量的位置。在AcepThread中有以下代码://Read from the InputStream
bytes=mmInStream.Read(buffer)
//将获取的字节发送到UI活动
mHandler.GetainMessage(BluetoothChat.MESSAGE_READ,bytes,-1,buffer)。sendToTarget()但我不知道它去了哪里。在connectedThread中,如果您的代码基于BluetoothChat。mHandler把信息发送给UITrue,谢谢。我看到这是消息
mConversationArrayAdapter.add(readMessage)