Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8

Получение данных Android java usb-serial

29.06.2024, 21:52. Показов 1059. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток пытаюсь получить по usb-serial и сделать парсинг полученным данным. Пока не получается может подскажете как правильно.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
package com.hoho.android.usbserial.examples;
 
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
 
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.HexDump;
import com.hoho.android.usbserial.util.SerialInputOutputManager;
 
import java.io.IOException;
import java.util.Arrays;
import java.util.EnumSet;
 
public class TerminalFragment extends Fragment implements SerialInputOutputManager.Listener {
 
    private enum UsbPermission { Unknown, Requested, Granted, Denied }
 
    private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
    private static final int WRITE_WAIT_MILLIS = 2000;
    private static final int READ_WAIT_MILLIS = 2000;
 
    private int deviceId, portNum, baudRate;
    private boolean withIoManager;
 
    private final BroadcastReceiver broadcastReceiver;
    private final Handler mainLooper;
    private TextView receiveText;
    private ControlLines controlLines;
 
    private SerialInputOutputManager usbIoManager;
    private UsbSerialPort usbSerialPort;
    private UsbPermission usbPermission = UsbPermission.Unknown;
    private boolean connected = false;
 
    private final byte[] Serial_Read_Data = new byte[25];//Данные принимаемые от компютера//5 байт "b"(98)+ 8 байт+2 байта ID + 10 штук "d"(100)
    private final char[] bufOutCAN00 = new char[8];  //MCO_STATE_A светофор
    private final char[] bufOutCAN01 = new char[8];  //IPD_STATE_A
    private final char[] bufOutCAN02 = new char[8];  //MM_STATION
    private final char[] bufOutCAN03 = new char[8];  //MM_SIGNAL
    private final char[] bufOutCAN04 = new char[8];  //IPD_DATE
    private final char[] bufOutCAN05 = new char[8];  //MM_COORD
    private final char[] bufOutCAN06 = new char[8];  //REG_STATE
    private final char[] bufOutCAN07 = new char[8];  //AMR_STATE
    private final char[] bufOutCAN08 = new char[8];  //BVU_STATE_A
    private final char[] bufOutCAN09 = new char[8];  //MCO_LIMITS_A
    private final char[] bufOutCAN10 = new char[8];  //SYS_DATA, INPUT_DATA
    private final char[] bufOutCAN11 = new char[8];  //SYS_DATA_STATE
    private final char[] bufOutCAN_EK = new char[8]; //AUX_RESOURCE_MM передает номер ЭК
//========================
//Чтение данных из COM порта
    private void read()
    {
        int size = 0;
        if(!connected)
        {
            Toast.makeText(getActivity(), "not connected", Toast.LENGTH_SHORT).show();
            return;
        }
 
        try {
            byte[] readBuffer = new byte[8192];
 
            int len = usbSerialPort.read(readBuffer, READ_WAIT_MILLIS);
            receive(Arrays.copyOf(readBuffer, len));
 
        } catch (IOException e) {
            // when using read with timeout, USB bulkTransfer returns -1 on timeout _and_ errors
            // like connection loss, so there is typically no exception thrown here on error
            status("connection lost: " + e.getMessage());
            disconnect();
        }
    }
 
    //====================================
    //Обработчик принятых данных
    //Данные принимаемые из компьютера 5 байт "b"(98)+ 8 байт+2 байта ID + 10 штук "d"(100)
    private void receive(byte[] data)
    {
        int S_DataRead = 0;        //байт считанный из буфера COM
        int opozkol = 0;               //число пришедших подряд опозновательных символов (должно быть 10 штук "d"(100))
 
        byte[] S = new byte [25];  //Вспомогательный массив для организации стека
        byte[] S1 = new byte [25]; //Вспомогательный массив для организации стека
 
        SpannableStringBuilder spn = new SpannableStringBuilder();
        //spn.append("receive " + data.length + " bytes\n");
        //для отладки (шестнадцатеичные строки, разделенные пробелом).
        //if(data.length > 0) spn.append(HexDump.dumpHexString(data)).append("\n");
 
       if(data.length > 0)
        {
            do{
 
               S_DataRead = data;
 
                if (S_DataRead >= 0)
                {
                    //Смещаем все значения в стеке на один байт
                    for (int i = 0; i <= 23; i++)//операция 1
                    {
                       S1[i + 1] = S[i];
                    }
                  
 
                    for (int i = 0; i <= 24; i++)//операция 2
                    {
                        S[i] = S1[i];
                    }
                   
 
 
                    S[0] = (byte)(S_DataRead & 0xFF);//Читаем байт low Byte
 
                    if (S_DataRead == 100)//Ищем начало - 10 штук "d"(100)
                    {
                        opozkol ++;
                    }
                    else
                    {
                        opozkol = 0;
                    }
 
 
                    if (S_DataRead == 100 & opozkol == 10)
                    {
                        //Если нашли начало , то обновляем стек
                        for (int i=0; i <= 24; i++)
                        {
                            Serial_Read_Data[i] = S[i];
                        }
                        
 
                        Serial_Parsing_Data();//Вызов функции разбор данных из COM порта.
                    }
                }
            }while (data.length > 0);
        }
 
 
       //spn.append("receive " + data.length + " bytes\n");
 
        //для отладки (шестнадцатеричные строки, разделенные пробелом).
 
        //if(data.length > 0) spn.append(HexDump.dumpHexString(data)).append("\n");
 
 
        spn.append("receive " + bufOutCAN00[0] + " bytes\n");
 
        receiveText.append(spn);
    }
//=================================
//Разбор данных из COM порта
    void Serial_Parsing_Data()
    {
        if (Serial_Read_Data[19] == 0)               //MCO_STATE_A
        {
            bufOutCAN00[0] = (char) Serial_Read_Data[18];
            bufOutCAN00[1] = (char) Serial_Read_Data[17];
            bufOutCAN00[2] = (char) Serial_Read_Data[16];
            bufOutCAN00[3] = (char) Serial_Read_Data[15];
            bufOutCAN00[4] = (char) Serial_Read_Data[14];
            bufOutCAN00[5] = (char) Serial_Read_Data[13];
            bufOutCAN00[6] = (char) Serial_Read_Data[12];
            bufOutCAN00[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 1)         //IPD_STATE_A
        {
            bufOutCAN01[0] = (char) Serial_Read_Data[18];
            bufOutCAN01[1] = (char) Serial_Read_Data[17];
            bufOutCAN01[2] = (char) Serial_Read_Data[16];
            bufOutCAN01[3] = (char) Serial_Read_Data[15];
            bufOutCAN01[4] = (char) Serial_Read_Data[14];
            bufOutCAN01[5] = (char) Serial_Read_Data[13];
            bufOutCAN01[6] = (char) Serial_Read_Data[12];
            bufOutCAN01[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 2)         //MM_STATION Название станции в кодировке Win-1251.
        {
            bufOutCAN02[0] = (char) Serial_Read_Data[18];
            bufOutCAN02[1] = (char) Serial_Read_Data[17];
            bufOutCAN02[2] = (char) Serial_Read_Data[16];
            bufOutCAN02[3] = (char) Serial_Read_Data[15];
            bufOutCAN02[4] = (char) Serial_Read_Data[14];
            bufOutCAN02[5] = (char) Serial_Read_Data[13];
            bufOutCAN02[6] = (char) Serial_Read_Data[12];
            bufOutCAN02[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 3)         //MM_SIGNAL Название первой от головы поезда цели (кодировка Win-1251).
        {
            bufOutCAN03[0] = (char) Serial_Read_Data[18];
            bufOutCAN03[1] = (char) Serial_Read_Data[17];
            bufOutCAN03[2] = (char) Serial_Read_Data[16];
            bufOutCAN03[3] = (char) Serial_Read_Data[15];
            bufOutCAN03[4] = (char) Serial_Read_Data[14];
            bufOutCAN03[5] = (char) Serial_Read_Data[13];
            bufOutCAN03[6] = (char) Serial_Read_Data[12];
            bufOutCAN03[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 4)         //IPD_DATE
        {
            bufOutCAN04[0] = (char) Serial_Read_Data[18];
            bufOutCAN04[1] = (char) Serial_Read_Data[17];
            bufOutCAN04[2] = (char) Serial_Read_Data[16];
            bufOutCAN04[3] = (char) Serial_Read_Data[15];
            bufOutCAN04[4] = (char) Serial_Read_Data[14];
            bufOutCAN04[5] = (char) Serial_Read_Data[13];
            bufOutCAN04[6] = (char) Serial_Read_Data[12];
            bufOutCAN04[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 5)         //MM_COORD
        {
            bufOutCAN05[0] = (char) Serial_Read_Data[18];
            bufOutCAN05[1] = (char) Serial_Read_Data[17];
            bufOutCAN05[2] = (char) Serial_Read_Data[16];
            bufOutCAN05[3] = (char) Serial_Read_Data[15];
            bufOutCAN05[4] = (char) Serial_Read_Data[14];
            bufOutCAN05[5] = (char) Serial_Read_Data[13];
            bufOutCAN05[6] = (char) Serial_Read_Data[12];
            bufOutCAN05[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 6)         //REG_STATE
        {
            bufOutCAN06[0] = (char) Serial_Read_Data[18];
            bufOutCAN06[1] = (char) Serial_Read_Data[17];
            bufOutCAN06[2] = (char) Serial_Read_Data[16];
            bufOutCAN06[3] = (char) Serial_Read_Data[15];
            bufOutCAN06[4] = (char) Serial_Read_Data[14];
            bufOutCAN06[5] = (char) Serial_Read_Data[13];
            bufOutCAN06[6] = (char) Serial_Read_Data[12];
            bufOutCAN06[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 7)         //ARM_STATE
        {
            bufOutCAN07[0] = (char) Serial_Read_Data[18];
            bufOutCAN07[1] = (char) Serial_Read_Data[17];
            bufOutCAN07[2] = (char) Serial_Read_Data[16];
            bufOutCAN07[3] = (char) Serial_Read_Data[15];
            bufOutCAN07[4] = (char) Serial_Read_Data[14];
            bufOutCAN07[5] = (char) Serial_Read_Data[13];
            bufOutCAN07[6] = (char) Serial_Read_Data[12];
            bufOutCAN07[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 8)         //BVU_STATE_A
        {
            bufOutCAN08[0] = (char) Serial_Read_Data[18];
            bufOutCAN08[1] = (char) Serial_Read_Data[17];
            bufOutCAN08[2] = (char) Serial_Read_Data[16];
            bufOutCAN08[3] = (char) Serial_Read_Data[15];
            bufOutCAN08[4] = (char) Serial_Read_Data[14];
            bufOutCAN08[5] = (char) Serial_Read_Data[13];
            bufOutCAN08[6] = (char) Serial_Read_Data[12];
            bufOutCAN08[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 9)        //MCO_LIMITS_A
        {
            bufOutCAN09[0] = (char) Serial_Read_Data[18];
            bufOutCAN09[1] = (char) Serial_Read_Data[17];
            bufOutCAN09[2] = (char) Serial_Read_Data[16];
            bufOutCAN09[3] = (char) Serial_Read_Data[15];
            bufOutCAN09[4] = (char) Serial_Read_Data[14];
            bufOutCAN09[5] = (char) Serial_Read_Data[13];
            bufOutCAN09[6] = (char) Serial_Read_Data[12];
            bufOutCAN09[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 10)        //SYS_DATA_INPUT_DATA
        {
            bufOutCAN10[0] = (char) Serial_Read_Data[18];
            bufOutCAN10[1] = (char) Serial_Read_Data[17];
            bufOutCAN10[2] = (char) Serial_Read_Data[16];
            bufOutCAN10[3] = (char) Serial_Read_Data[15];
            bufOutCAN10[4] = (char) Serial_Read_Data[14];
            bufOutCAN10[5] = (char) Serial_Read_Data[13];
            bufOutCAN10[6] = (char) Serial_Read_Data[12];
            bufOutCAN10[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 11)        //SYS_DATA_STATE
        {
            bufOutCAN11[0] = (char) Serial_Read_Data[18];
            bufOutCAN11[1] = (char) Serial_Read_Data[17];
            bufOutCAN11[2] = (char) Serial_Read_Data[16];
            bufOutCAN11[3] = (char) Serial_Read_Data[15];
            bufOutCAN11[4] = (char) Serial_Read_Data[14];
            bufOutCAN11[5] = (char) Serial_Read_Data[13];
            bufOutCAN11[6] = (char) Serial_Read_Data[12];
            bufOutCAN11[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 12)         //AUX_RESOURCE_MM
        {
            bufOutCAN_EK[0] = (char) Serial_Read_Data[18];
            bufOutCAN_EK[1] = (char) Serial_Read_Data[17];
            bufOutCAN_EK[2] = (char) Serial_Read_Data[16];
            bufOutCAN_EK[3] = (char) Serial_Read_Data[15];
            bufOutCAN_EK[4] = (char) Serial_Read_Data[14];
            bufOutCAN_EK[5] = (char) Serial_Read_Data[13];
            bufOutCAN_EK[6] = (char) Serial_Read_Data[12];
            bufOutCAN_EK[7] = (char) Serial_Read_Data[11];
        }
        return;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2024, 21:52
Ответы с готовыми решениями:

Получение и отправка данных через USB Java
Подскажите пожалуйста. Есть либы которые позволяют принимать запросы по USB и отсылать данные?

Получение данных от Bluetooth в Android Studio (Java)
Здравствуйте! пытаюсь написать приложение, принимающее данные по Bluetooth и отображающие их на экране в текстовом окне. Нашёл пример, но...

Своевременное получение данных их serial и обработка уже полученных данных
Всем привет Нужна помощь в понимании, как правильнее реализовать алгоритм, в идеале конечно с базовым примером. В serial приходят...

13
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
29.06.2024, 22:06  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
package com.hoho.android.usbserial.examples;
 
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
 
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.HexDump;
import com.hoho.android.usbserial.util.SerialInputOutputManager;
 
import java.io.IOException;
import java.util.Arrays;
import java.util.EnumSet;
 
public class TerminalFragment extends Fragment implements SerialInputOutputManager.Listener {
 
    private enum UsbPermission { Unknown, Requested, Granted, Denied }
 
    private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
    private static final int WRITE_WAIT_MILLIS = 2000;
    private static final int READ_WAIT_MILLIS = 2000;
 
    private int deviceId, portNum, baudRate;
    private boolean withIoManager;
 
    private final BroadcastReceiver broadcastReceiver;
    private final Handler mainLooper;
    private TextView receiveText;
    private ControlLines controlLines;
 
    private SerialInputOutputManager usbIoManager;
    private UsbSerialPort usbSerialPort;
    private UsbPermission usbPermission = UsbPermission.Unknown;
    private boolean connected = false;
 
    private final byte[] Serial_Read_Data = new byte[25];//Данные принимаемые от компютера//5 байт "b"(98)+ 8 байт+2 байта ID + 10 штук "d"(100)
    private final char[] bufOutCAN00 = new char[8];  //MCO_STATE_A светофор
    private final char[] bufOutCAN01 = new char[8];  //IPD_STATE_A
    private final char[] bufOutCAN02 = new char[8];  //MM_STATION
    private final char[] bufOutCAN03 = new char[8];  //MM_SIGNAL
    private final char[] bufOutCAN04 = new char[8];  //IPD_DATE
    private final char[] bufOutCAN05 = new char[8];  //MM_COORD
    private final char[] bufOutCAN06 = new char[8];  //REG_STATE
    private final char[] bufOutCAN07 = new char[8];  //AMR_STATE
    private final char[] bufOutCAN08 = new char[8];  //BVU_STATE_A
    private final char[] bufOutCAN09 = new char[8];  //MCO_LIMITS_A
    private final char[] bufOutCAN10 = new char[8];  //SYS_DATA, INPUT_DATA
    private final char[] bufOutCAN11 = new char[8];  //SYS_DATA_STATE
    private final char[] bufOutCAN_EK = new char[8]; //AUX_RESOURCE_MM передает номер ЭК
//========================
//Чтение данных из COM порта
    private void read()
    {
        int size = 0;
        if(!connected)
        {
            Toast.makeText(getActivity(), "not connected", Toast.LENGTH_SHORT).show();
            return;
        }
 
        try {
            byte[] readBuffer = new byte[64];
 
            int len = usbSerialPort.read(readBuffer, READ_WAIT_MILLIS);
            receive(Arrays.copyOf(readBuffer, len));
 
        } catch (IOException e) {
            // when using read with timeout, USB bulkTransfer returns -1 on timeout _and_ errors
            // like connection loss, so there is typically no exception thrown here on error
            status("connection lost: " + e.getMessage());
            disconnect();
        }
    }
 
    //====================================
    //Обработчик принятых данных
    //Данные принимаемые из компьютера 5 байт "b"(98)+ 8 байт+2 байта ID + 10 штук "d"(100)
    private void receive(byte[] data)
    {
        int S_DataRead = 0;        //байт считанный из буфера COM
        int opozkol = 0;               //число пришедших подряд опозновательных символов (должно быть 10 штук "d"(100))
 
        byte[] S = new byte [25];  //Вспомогательный массив для организации стека
        byte[] S1 = new byte [25]; //Вспомогательный массив для организации стека
 
        SpannableStringBuilder spn = new SpannableStringBuilder();
        //spn.append("receive " + data.length + " bytes\n");
        //для отладки (шестнадцатеичные строки, разделенные пробелом).
        //if(data.length > 0) spn.append(HexDump.dumpHexString(data)).append("\n");
 
       if(data.length > 0)
        {
            do{
 
                   for (int j = 0; j <= data.length; j++)
                   {
                         S_DataRead  = data[j];//Чтение полученных данных для последующего разбора
                    }
 
                if (S_DataRead >= 0)
                {
                    //Смещаем все значения в стеке на один байт
                    for (int i = 0; i <= 23; i++)//операция 1
                    {
                       S1[i + 1] = S[i];
                    }
                  
 
                    for (int i = 0; i <= 24; i++)//операция 2
                    {
                        S[i] = S1[i];
                    }
                   
 
 
                    S[0] = (byte)(S_DataRead & 0xFF);//Читаем байт low Byte
 
                    if (S_DataRead == 100)//Ищем начало - 10 штук "d"(100)
                    {
                        opozkol ++;
                    }
                    else
                    {
                        opozkol = 0;
                    }
 
 
                    if (S_DataRead == 100 & opozkol == 10)
                    {
                        //Если нашли начало , то обновляем стек
                        for (int i=0; i <= 24; i++)
                        {
                            Serial_Read_Data[i] = S[i];
                        }
                        
 
                        Serial_Parsing_Data();//Вызов функции разбор данных из COM порта.
                    }
                }
            }while (data.length > 0);
        }
 
 
       //spn.append("receive " + data.length + " bytes\n");
 
        //для отладки (шестнадцатеричные строки, разделенные пробелом).
 
        //if(data.length > 0) spn.append(HexDump.dumpHexString(data)).append("\n");
 
 
        spn.append("receive " + bufOutCAN00[0] + " bytes\n");
 
        receiveText.append(spn);
    }
//=================================
//Разбор данных из COM порта
    void Serial_Parsing_Data()
    {
        if (Serial_Read_Data[19] == 0)               //MCO_STATE_A
        {
            bufOutCAN00[0] = (char) Serial_Read_Data[18];
            bufOutCAN00[1] = (char) Serial_Read_Data[17];
            bufOutCAN00[2] = (char) Serial_Read_Data[16];
            bufOutCAN00[3] = (char) Serial_Read_Data[15];
            bufOutCAN00[4] = (char) Serial_Read_Data[14];
            bufOutCAN00[5] = (char) Serial_Read_Data[13];
            bufOutCAN00[6] = (char) Serial_Read_Data[12];
            bufOutCAN00[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 1)         //IPD_STATE_A
        {
            bufOutCAN01[0] = (char) Serial_Read_Data[18];
            bufOutCAN01[1] = (char) Serial_Read_Data[17];
            bufOutCAN01[2] = (char) Serial_Read_Data[16];
            bufOutCAN01[3] = (char) Serial_Read_Data[15];
            bufOutCAN01[4] = (char) Serial_Read_Data[14];
            bufOutCAN01[5] = (char) Serial_Read_Data[13];
            bufOutCAN01[6] = (char) Serial_Read_Data[12];
            bufOutCAN01[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 2)         //MM_STATION Название станции в кодировке Win-1251.
        {
            bufOutCAN02[0] = (char) Serial_Read_Data[18];
            bufOutCAN02[1] = (char) Serial_Read_Data[17];
            bufOutCAN02[2] = (char) Serial_Read_Data[16];
            bufOutCAN02[3] = (char) Serial_Read_Data[15];
            bufOutCAN02[4] = (char) Serial_Read_Data[14];
            bufOutCAN02[5] = (char) Serial_Read_Data[13];
            bufOutCAN02[6] = (char) Serial_Read_Data[12];
            bufOutCAN02[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 3)         //MM_SIGNAL Название первой от головы поезда цели (кодировка Win-1251).
        {
            bufOutCAN03[0] = (char) Serial_Read_Data[18];
            bufOutCAN03[1] = (char) Serial_Read_Data[17];
            bufOutCAN03[2] = (char) Serial_Read_Data[16];
            bufOutCAN03[3] = (char) Serial_Read_Data[15];
            bufOutCAN03[4] = (char) Serial_Read_Data[14];
            bufOutCAN03[5] = (char) Serial_Read_Data[13];
            bufOutCAN03[6] = (char) Serial_Read_Data[12];
            bufOutCAN03[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 4)         //IPD_DATE
        {
            bufOutCAN04[0] = (char) Serial_Read_Data[18];
            bufOutCAN04[1] = (char) Serial_Read_Data[17];
            bufOutCAN04[2] = (char) Serial_Read_Data[16];
            bufOutCAN04[3] = (char) Serial_Read_Data[15];
            bufOutCAN04[4] = (char) Serial_Read_Data[14];
            bufOutCAN04[5] = (char) Serial_Read_Data[13];
            bufOutCAN04[6] = (char) Serial_Read_Data[12];
            bufOutCAN04[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 5)         //MM_COORD
        {
            bufOutCAN05[0] = (char) Serial_Read_Data[18];
            bufOutCAN05[1] = (char) Serial_Read_Data[17];
            bufOutCAN05[2] = (char) Serial_Read_Data[16];
            bufOutCAN05[3] = (char) Serial_Read_Data[15];
            bufOutCAN05[4] = (char) Serial_Read_Data[14];
            bufOutCAN05[5] = (char) Serial_Read_Data[13];
            bufOutCAN05[6] = (char) Serial_Read_Data[12];
            bufOutCAN05[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 6)         //REG_STATE
        {
            bufOutCAN06[0] = (char) Serial_Read_Data[18];
            bufOutCAN06[1] = (char) Serial_Read_Data[17];
            bufOutCAN06[2] = (char) Serial_Read_Data[16];
            bufOutCAN06[3] = (char) Serial_Read_Data[15];
            bufOutCAN06[4] = (char) Serial_Read_Data[14];
            bufOutCAN06[5] = (char) Serial_Read_Data[13];
            bufOutCAN06[6] = (char) Serial_Read_Data[12];
            bufOutCAN06[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 7)         //ARM_STATE
        {
            bufOutCAN07[0] = (char) Serial_Read_Data[18];
            bufOutCAN07[1] = (char) Serial_Read_Data[17];
            bufOutCAN07[2] = (char) Serial_Read_Data[16];
            bufOutCAN07[3] = (char) Serial_Read_Data[15];
            bufOutCAN07[4] = (char) Serial_Read_Data[14];
            bufOutCAN07[5] = (char) Serial_Read_Data[13];
            bufOutCAN07[6] = (char) Serial_Read_Data[12];
            bufOutCAN07[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 8)         //BVU_STATE_A
        {
            bufOutCAN08[0] = (char) Serial_Read_Data[18];
            bufOutCAN08[1] = (char) Serial_Read_Data[17];
            bufOutCAN08[2] = (char) Serial_Read_Data[16];
            bufOutCAN08[3] = (char) Serial_Read_Data[15];
            bufOutCAN08[4] = (char) Serial_Read_Data[14];
            bufOutCAN08[5] = (char) Serial_Read_Data[13];
            bufOutCAN08[6] = (char) Serial_Read_Data[12];
            bufOutCAN08[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 9)        //MCO_LIMITS_A
        {
            bufOutCAN09[0] = (char) Serial_Read_Data[18];
            bufOutCAN09[1] = (char) Serial_Read_Data[17];
            bufOutCAN09[2] = (char) Serial_Read_Data[16];
            bufOutCAN09[3] = (char) Serial_Read_Data[15];
            bufOutCAN09[4] = (char) Serial_Read_Data[14];
            bufOutCAN09[5] = (char) Serial_Read_Data[13];
            bufOutCAN09[6] = (char) Serial_Read_Data[12];
            bufOutCAN09[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 10)        //SYS_DATA_INPUT_DATA
        {
            bufOutCAN10[0] = (char) Serial_Read_Data[18];
            bufOutCAN10[1] = (char) Serial_Read_Data[17];
            bufOutCAN10[2] = (char) Serial_Read_Data[16];
            bufOutCAN10[3] = (char) Serial_Read_Data[15];
            bufOutCAN10[4] = (char) Serial_Read_Data[14];
            bufOutCAN10[5] = (char) Serial_Read_Data[13];
            bufOutCAN10[6] = (char) Serial_Read_Data[12];
            bufOutCAN10[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 11)        //SYS_DATA_STATE
        {
            bufOutCAN11[0] = (char) Serial_Read_Data[18];
            bufOutCAN11[1] = (char) Serial_Read_Data[17];
            bufOutCAN11[2] = (char) Serial_Read_Data[16];
            bufOutCAN11[3] = (char) Serial_Read_Data[15];
            bufOutCAN11[4] = (char) Serial_Read_Data[14];
            bufOutCAN11[5] = (char) Serial_Read_Data[13];
            bufOutCAN11[6] = (char) Serial_Read_Data[12];
            bufOutCAN11[7] = (char) Serial_Read_Data[11];
        }
        else if (Serial_Read_Data[19] == 12)         //AUX_RESOURCE_MM
        {
            bufOutCAN_EK[0] = (char) Serial_Read_Data[18];
            bufOutCAN_EK[1] = (char) Serial_Read_Data[17];
            bufOutCAN_EK[2] = (char) Serial_Read_Data[16];
            bufOutCAN_EK[3] = (char) Serial_Read_Data[15];
            bufOutCAN_EK[4] = (char) Serial_Read_Data[14];
            bufOutCAN_EK[5] = (char) Serial_Read_Data[13];
            bufOutCAN_EK[6] = (char) Serial_Read_Data[12];
            bufOutCAN_EK[7] = (char) Serial_Read_Data[11];
        }
        return;
    }
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 15:37
Я уже забыл, как на Java писать. В функции receive(byte[] data) я не вижу выхода из цикла.
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
30.06.2024, 15:42  [ТС]
Вот моя попытка выхода из цикла по отсутствию входных данных
Code
1
while (data.length > 0);
возможно я это сделал неправильно.

Это попытка переписать код на С++ который отлично работал на java
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 15:46
Ну... а data.length где меняется?
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
30.06.2024, 15:49  [ТС]
хороший вопрос скорее всего я написал фигню тогда как проверить что данных больше нет во входном массиве чтобы выйти из цикла
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 15:56
Да и цикл for какой-то сомнительный
Code
1
2
3
4
for (int j = 0; j <= data.length; j++)
{
    S_DataRead  = data[j];
}
Если ты хочешь последнее значение, то проще
Code
1
S_DataRead  = data[data.length-1];
Добавлено через 5 минут
Проще всего наверно будет
Code
1
2
3
4
5
6
7
8
9
10
if (data.length > 0) {
    for (int i = 0; i < data.length; i++) {
    
    // ну и считывай тут байты
 
    }
}
 
spn.append("receive " + bufOutCAN00[0] + " bytes\n");
receiveText.append(spn);
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
30.06.2024, 16:07  [ТС]
В функции private void read() я выполняю receive(Arrays.copyOf(readBuffer, len));
а отсюда уже дальше в private void receive(byte[] data) мне нужно забирать принятые данные и делать разбор но вот смотрю на код и что то мне кажется что тут какой то косяк.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void loop()
{
 
  //Организация чтения данных, приходят в развернутом виде и считываются с конца
  if (Serial.available() > 0) 
  {
      do{
        Byte_ReadPC = Serial.read();
        
        if (Byte_ReadPC >= 0)//Проверяем наличие данных из PC
        {
            //Смещаем все значения в стеке на один байт
            //Реализуем структуру первый пришёл последний ушёл
            for (int i = 0; i <= 23; i++)//операция 1
            {
              steck1[i + 1] = steck[i];
            }
            
            for (int i = 0; i <= 24; i++)//операция 2
            {
              steck[i] = steck1[i];
            }
            
            steck[0] = lowByte(Byte_ReadPC);//Читаем байт
            
          //Ищем начало - 10 штук "d"(100)
          if (Byte_ReadPC == 100)
          {
            OpozKol++;
          }
          else
          {
            OpozKol  = 0;
          }
 
          //Проверям что мы нашли начало пакета - 10 штук "d"(100) 
          if (Byte_ReadPC == 100 & OpozKol == 10)
          {
             for (int i = 0; i <= 24; i++)//Если нашли начало, то обновляем стек 
             { 
                Serial_Data_ReadPC[i] = steck[i]; 
             }
             SerialParsingData();//Вызываем функцию разбора данных полученных от PC
           }
        }
      }while (Serial.available() > 0);//Выполняем пока в буфере UART есть данные
   }
}
Добавлено через 9 минут
вот что получилось
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private void receive(byte[] data)
{
   int S_DataRead = 0;        //байт считанный из буфера COM
   int opozkol = 0;               //число пришедших подряд опозновательных символов (должно быть 10 штук "d"(100))
 
   byte[] S = new byte [25];  //Вспомогательный массив для организации стека
   byte[] S1 = new byte [25]; //Вспомогательный массив для организации стека
 
   if(data.length > 0)
   {
       for (int i = 0; i < data.length; i++) 
       {
            S_DataRead  = data[i];//Чтение полученных данных для последующего разбора
            
            if (S_DataRead >= 0)
            {
                    //Смещаем все значения в стеке на один байт
                    for (int i = 0; i <= 23; i++)//операция 1
                    {
                       S1[i + 1] = S[i];
                    }
                  
 
                    for (int i = 0; i <= 24; i++)//операция 2
                    {
                        S[i] = S1[i];
                    }
                   
                    S[0] = (byte)(S_DataRead & 0xFF);//Читаем байт low Byte
 
                    if (S_DataRead == 100)//Ищем начало - 10 штук "d"(100)
                    {
                        opozkol ++;
                    }
                    else
                    {
                        opozkol = 0;
                    }
 
                    if (S_DataRead == 100 & opozkol == 10)
                    {
                        //Если нашли начало , то обновляем стек
                        for (int i=0; i <= 24; i++)
                        {
                            Serial_Read_Data[i] = S[i];
                        }
                        
                        Serial_Parsing_Data();//Вызов функции разбор данных из COM порта.
                    }
           }//конец if (S_DataRead >= 0)
       }//конец for (int i = 0; i < data.length; i++)
   }//конец if(data.length > 0)
}//конец private void receive(byte[] data)
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 16:12
Не, сорри, я в прошлый раз ошибся. Если надо считывать с конца, то:
Code
1
2
3
4
5
for (int i = data.length-1; i >= 0; i--) {
 
    // код
 
}
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
30.06.2024, 16:34  [ТС]
так что то заработало но значение из массива bufOutCAN00[0] не выводит нужно доставать оттуда параметры по которым буду управлять различными элементами визуализации.
Спасибо за то что все сдвинулось с мертвой точки это радует.
Code
1
2
3
4
    Serial_Parsing_Data();//Вызов функции разбор данных из COM порта.
    SpannableStringBuilder spn = new SpannableStringBuilder();
    spn.append("receive " + bufOutCAN00[0] + " bytes\n");
    receiveText.append(spn);
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 16:50
Ну, ок, рад, что чем-то помог )

Но, я примерно сообразил в чем проблема:
В исходном коде функции Serial.available() - представляет весь буфер; и Serial.read() - которая считывает данные из буфера. И основной прикол в том, что Serial.read() помимо того, что считывает первый байт, она также удалаяет его из буфера. В документации, как ни странно этого не написано, но если сравнивать Serial.read() с Serial.peek(), то скорее всего Serial.read() работает, как предполагал выше.
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
30.06.2024, 16:53  [ТС]
так если это работало на ардуинке а там по сути С++ то как заставить это работать на планшете если я правильно вас понимаю данные не удаляются и буфер забивается
0
9 / 5 / 4
Регистрация: 05.10.2022
Сообщений: 32
30.06.2024, 17:54
Я так понимаю, что ты используешь эту библиотеку? У UsbSerialPort есть метод read(), его и используй, он, судя по всему, считывает байты по позициям, работая аналогом Serial.read(). Ну да, не удаляет буффер, но в отличии от ардуинки на планшете памяти побольше, уж как-то мы можем пережить 25 лишних байт Вызови просто disconnect() как в примере на методе onPause() или onDestroyView(). А там уже GB подчистит и буффер, и ссылки и т.д. И не парься, короче

Ты не на C работаешь для какой-то специфической платы, где надо трястись на каждый клочок памяти. Это же Java, а там вообще никому не известно, какие настройки производитель воткнул в JVM, для типов переменных могут быть непредсказуемые размеры в байтах.
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 8
03.07.2024, 11:33  [ТС]
Да я использовал именно этот пример чтото получается какая-то фигня к сожалению на сегодняшний день это выглядит так https://github.com/alexval2014... ndroid.git
Почему-то пример выдает данные пакетами по 32 байта хотя у меня отправляется пакет 25 байт но он разбивает их по 32 в результате какое-то месиво большая часть данных теряется. Печалька буду дальше пытаться найти причину
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2024, 11:33
Помогаю со студенческими работами здесь

Подключение к базе данных, и получение данных с сервера 1С в виде данных xml файла в android studio
Доброго времени суток. Я новичок в android studio, столкнулся с такой проблемой в разработке мобильного приложения. Попытаюсь...

Отправка запроса-получение ответа из Java программы на Android
Добрый вечер, изучаю потихоньку Java, по учёбе хотел реализовать программу, которая представляет из себя следующее 1) программа на Java...

Отправка запроса-получение ответа из Java программы на Android
Добрый вячур, изучаю потихоньку Java, по учёбе хотел реализовать программу, которая представляет из себя следующее 1) программа на Java...

Java и USB передача данных - Java SE
Нужно сделать приложение. Его суть такова: Есть микроконтроллер (TTL) - он подключается через USB к ПК. Микроконтроллер передаёт данные на...

Получение данных с USB/COM-порта
Добрый день! Необходимо получить данные с USB-порта. Можете подсказать с чего начинать? Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru