【问题标题】:Why I can’t receive complete string from Arduino to Android using Bluetooth?为什么我无法使用蓝牙接收从 Arduino 到 Android 的完整字符串?
【发布时间】:2017-01-05 01:04:51
【问题描述】:

我正在通过蓝牙将字符串从 arduino 发送到 Android,当字符串到达​​应用程序时,我会创建子字符串以获取我需要的数据。但是,字符串不完整,它们被剪切,因此我无法获得所需的子字符串。例如:从 Arduino 我发送这种风格的字符串:

#ecg{21304(2.41~

当我在 arduino 串行监视器上发送多个字符串时,如下所示:

#ecg{0(137~
#ecg{1(136~
#ecg{3(162~
#ecg{5(221~
#ecg{6(282~
#ecg{8(296~
#ecg{10(259~
#ecg{12(208~
#ecg{13(166~
#ecg{15(141~
#ecg{17(132~
#ecg{19(144~
#ecg{20(194~
#ecg{22(262~
#ecg{24(296~
#ecg{26(267~
#ecg{27(217~
#ecg{29(173~
#ecg{31(143~

但是当他们到达 Android 时,这个到达剪辑,是这样的:

I/System.out: ReadMessage: #ecg{6147 end string
I/System.out: ReadMessage: 0(335~
I/System.out: #ecg{61472(335~
I/System.out: #ecg{61474(273~
I/System.out: #ecg{61476(230~
I/System.out: #ecg{61478(252~
I/System.out: #ecg{61480(307~
I/System.out: #ecg{61483(307~
I/System.out: #ecg{61485(279~
I/System.out: #ecg{61487(306~
I/System.out: #ecg{61488(347~
I/System.out: #ecg{61490(313~
I/System.out: #ecg{61492(249~
I/System.out: #ecg{61494(231~
I/System.out: #ecg{61496(277~
I/System.out: #ecg{61498(320~
I/System.out: #ecg{61500 end string
I/System.out: ReadMessage: (290~
I/System.out: #ecg{61502(284~
I/System.out: #ecg{61504(328~
I/System.out: #ecg{61506(343~
I/System.out: #ecg{61507(283~
I/System.out: #ecg{61509(237~
I/System.out: #ecg{61511(246~
I/System.out: #ecg{61513(303~
I/System.out: #ecg{61515(311~
I/System.out: #ecg{61517(280~
I/System.out: #ecg{61519(301~
I/System.out: #ecg{61521(346~
I/System.out: #ecg{61523(321~
I/System.out: #ecg{61524(258~
I/System.out: #ecg{61527(230~
I/System.out: #ecg{61529( end string
I/System.out: ReadMessage: 269~
I/System.out: #ecg{61531(318~

请注意,在大多数情况下,它们从一开始就没有完成。

我想得到这样的字符串:

I/System.out: ReadMessage: #ecg{61502(284~ end string
I/System.out: ReadMessage: #ecg{61502(284~ end string
I/System.out: ReadMessage: #ecg{61504(328~ end string
I/System.out: ReadMessage: #ecg{61506(343~ end string
I/System.out: ReadMessage: #ecg{61507(283~ end string

因此我无法创建我需要的子字符串。你知道为什么当我从 arduino 发送琴弦时,琴弦被剪断而不完整吗?有什么办法解决吗?

不完整的字符串接收可能是因为我在 Arduino 代码 (115200) 中使用的速度传输? 我测试了在另一个 arduino 上加载一个程序,该程序通过蓝牙将数据发送到同一个应用程序,并且这些都很好,不同之处在于它将数据发送到 9600

这是我发送的 Arduino 代码:

    #include <eHealth.h>

  String CadenaUno="";
  String CadenaDos="";
  String CadenaTres="";
  String CadenaFinal="";

// The setup routine runs once when you press reset:
void setup() {
  Serial.flush();
  Serial.begin(115200);
 // Serial.begin(9600); //No muestra nada en android studio a esta velocidad
}
// The loop routine runs over and over again forever:
void loop() {
        long currentMillis = millis();
        float floatecgValue = eHealth.getECG();
        int valueECG = floatecgValue*100;
                    CadenaUno="#ecg{";
                    CadenaDos="(";
                    CadenaTres="~";
                    CadenaFinal=CadenaUno+currentMillis+CadenaDos+valueECG+CadenaTres;                    
                    Serial.println(CadenaFinal);    
                   delay(1); 
}

这是我验证通过蓝牙从 arduino 到达的数据的部分

        while (mState == STATE_CONNECTED) {
            try {
                StringBuilder recDataString = new StringBuilder();
                String paquete = "";

                String outputText="";
                byte[] buffer = new byte[256];
                bytes = mmInStream.read(buffer);
                mDataParse.Add(buffer, bytes);
                String readMessage = new String(buffer, 0, bytes);
                System.out.println("ReadMessage: "+readMessage+" end string");

请指导。

【问题讨论】:

    标签: android bluetooth arduino


    【解决方案1】:

    试试这个:

    String prev = null;
    while (mState == STATE_CONNECTED) {
        try {
            StringBuilder recDataString = new StringBuilder();
            String paquete = "";
    
            String outputText = "";
            byte[] buffer = new byte[256];
            bytes = mmInStream.read(buffer);
            mDataParse.Add(buffer, bytes);
            String readMessage = new String(buffer, 0, bytes);
            //Split by new line symbol
            String[] msgs = readMesage.split("\n");
            int msgsCount = msgs.length;
            //Check is we have a prev not completed message?
            if (msgsCount > 0) {
                if (prev != null)
                    msgs[0] = prev + msgs[0]; //add it to first message
    
                //Check is last message completed?
                if (readMessage.endsWith("\n"))
                    prev = null;
                else {
                    prev = msgs[msgsCount - 1]; //Set last message to prev and remove it from output
                    msgsCount--;
                }
    
                for (int i = 0; i < msgsCount; i++) {
                    System.out.println("ReadMessage: " + msgs[i] + " end string");
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多