2013-08-01 110 views
0

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

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

所以,我需要知道正确的方法去做这个。这里是我定义的发送功能代码:

/** 
* 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. 

在我得到的字节发送的一部分,我不知道如果正确的做法是将这5个字符串添加到1并发送这一个(也许这将是很长的,如果我这样做),或创建一个函数发送这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); 
} 
+0

它是什么样的CRC的? 如果你想发送同一帧中的所有数据,你可以做'string stringToSend = message1 + message2 + message3 + message4 + message5',但我认为这不是最好的主意。 当我必须发送蓝牙帧时,我更喜欢使用一个标头,比如'11AA',然后发送帧长度,然后发送帧内容。与此同时,你会更容易抓住一个新的框架。 –

+0

我正在考虑逐一发送每封邮件。我发送第一,我等待,直到我收到确认,然后发送下一个。我需要计算的CRC是这个变量:{send_comand,num_byte_trama,num_byte_variable,pos_reg,value}。所以,我需要创建一个函数来计算每个消息的这些变量的CRC。请帮助一些。 – masmic

+0

是的,但它是哪种CRC? 16? 32? –

回答

1

为了您的框架,我推荐你使用这种框架:

final byte[] HEADER = AA11 // For example // When you want to send a message : Strign messageToSend = new String(HEADER) + yourStringMessage

它会当你收到它时,你更容易分析这个框架。

然后,对于CRC来说,如果你不告诉CRC的种类,我无法回答。在我的应用程序,我用

private static char createCRC(byte[] frame) 
{ 
    int crc = 0; 
    for(byte i : frame) 
    { 
     crc = crc^i; 
    } 
    return (char)crc; 
} 

由“异或”我的消息的每个字节创造CRC,然后检查CRC很容易

更新:好吧,我终于得到它。

在BluetoothChat活动中,您将获得一个字符串版本的消息,并且会获得字节[]。 如果你想获得消息的第一个字节,就在String readMessage = new String(readBuf, 0, msg.arg1); 然后加入byte myByte = readBuf[0]String readMessage = new String(myByte, 0, msg.arg1);

+0

我真的不知道如何计算CRC或我需要什么样的CRC。我刚刚开始在android上编写这个项目。制作MCU软件的我的合作伙伴不知道他计算的是什么样的CRC。他只是说我必须总结这些变量的字节,然后转换为十六进制。关于字符串消息发送,我感谢您的建议,但我不知道如何去做,所以我会先尝试使用我的方法。我想问你的是: – masmic

+0

例如,当我发送message1时,MCU给我发送一个响应。我需要知道如何得到这个响应并阅读它,它会是{2b 00 00},而中间的00是我需要确认它已经被正确发送并且继续发送消息2。我使用为这个purpouse修改的bluetoohchat示例的代码,但我没有找到在哪里读取以获取响应变量 – masmic

+0

在aceptThread中有这样的代码:_ //从InputStream_中读取_byte = mmInStream.read(buffer );' _ //发送获得的字节到UI Activity_ 'mHandler.obtainMessage(BluetoothChat.MESSAGE_READ,bytes,-1,buffer) .sendToTarget();'但我不知道它在哪里。 – masmic

相关问题