質問編集履歴

7

タイトルの編集

2017/01/08 06:18

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
@@ -1 +1 @@
1
- c++によるXMODEMが送受信できません
1
+ c++によるXMODEM受信関数を作っているが、dataの読み込みする前に終了する
test CHANGED
File without changes

6

デバッグにおける修正

2017/01/08 06:18

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
@@ -14,15 +14,23 @@
14
14
 
15
15
  受信側のxmodem_receiveはそこで終了します。
16
16
 
17
- ![受信側](c782c1b44fff2ff1a474563138dff5e0.png)
17
+ ![受信側](b0f950fa3f99da5fafec4ce52ac0d3dc.png)
18
18
 
19
19
  データの受信を続けたいのですが、
20
20
 
21
- 肝心のデータ受信部分で"Invalid argument"出力されてしまいます
21
+ 肝心のデータ受信部分が動作しません
22
-
23
-
24
-
22
+
25
- エラハンドリングと関数ついのアドバイスの方おねがいします。
23
+ タを受け取らず終了してしまいます。
24
+
25
+ プログラムの構成がいけないのでしょうか
26
+
27
+ また、STKを
28
+
29
+ データから受信する際にprintfで出力したら
30
+
31
+ if文の(recSTX == X_STX)で通るにもかかわらず
32
+
33
+ ’K’と出てくるのはなぜなのでしょうか。
26
34
 
27
35
 
28
36
 
@@ -114,7 +122,17 @@
114
122
 
115
123
 
116
124
 
125
+
126
+
127
+ if(recSTX == X_STX){
128
+
117
- printf("STX is %c\n", &recSTX);
129
+ printf("STX is %c\n", &recSTX);
130
+
131
+ }else{
132
+
133
+ printf("Garabage payload %c\n", &recSTX);
134
+
135
+ }
118
136
 
119
137
  fflush(stdout);
120
138
 
@@ -138,7 +156,7 @@
138
156
 
139
157
  ret = read(serial_fd, &recBlk, sizeof(recBlk));
140
158
 
141
- printf("Block Num is %c\n", &recBlk);
159
+ printf("Block Num is %d\n", recBlk);
142
160
 
143
161
  fflush(stdout);
144
162
 
@@ -152,7 +170,7 @@
152
170
 
153
171
  ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
154
172
 
155
- printf("Negative Block Num is %c\n", &recNegBlk);
173
+ printf("Negative Block Num is %d\n", recNegBlk);
156
174
 
157
175
  fflush(stdout);
158
176
 
@@ -278,10 +296,6 @@
278
296
 
279
297
  ```c++
280
298
 
281
-
282
-
283
-
284
-
285
299
  int main(int argc, char **argv)
286
300
 
287
301
  {
@@ -290,6 +304,26 @@
290
304
 
291
305
 
292
306
 
307
+ printf("STX: %c\n", X_STX);
308
+
309
+
310
+
311
+ printf("ACK: %c\n", X_ACK);
312
+
313
+
314
+
315
+ printf("NAK: %c\n", X_NAK);
316
+
317
+
318
+
319
+ printf("EOF: %c\n", X_EOF);
320
+
321
+
322
+
323
+ fflush(stdout);
324
+
325
+
326
+
293
327
  serial_fd = open_serial("/dev/ttyUSB0", 115200);
294
328
 
295
329
  if (serial_fd < 0)
@@ -332,4 +366,6 @@
332
366
 
333
367
 
334
368
 
369
+
370
+
335
371
  ```

5

文章の変更

2017/01/08 05:40

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,11 @@
18
18
 
19
19
  データの受信を続けたいのですが、
20
20
 
21
+ 肝心のデータ受信部分で"Invalid argument"が出力されてしまいます。
22
+
23
+
24
+
21
- この関数のどこらへんおかしのでょうか
25
+ エラーハンドリングと関数についてアドバイスの方おねがいします
22
26
 
23
27
 
24
28
 

4

コードと画像の追記

2017/01/07 08:45

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
@@ -10,10 +10,12 @@
10
10
 
11
11
  受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
12
12
 
13
- ![イメージ説明](fc19dd9a69375554f8ef9ddb44aafeeb.png)
13
+ ![送信側](fc19dd9a69375554f8ef9ddb44aafeeb.png)
14
14
 
15
15
  受信側のxmodem_receiveはそこで終了します。
16
16
 
17
+ ![受信側](c782c1b44fff2ff1a474563138dff5e0.png)
18
+
17
19
  データの受信を続けたいのですが、
18
20
 
19
21
  この関数のどこらへんがおかしいのでしょうか。
@@ -30,6 +32,8 @@
30
32
 
31
33
  ```c++
32
34
 
35
+
36
+
33
37
  static int xmodem_receive(int serial_fd, char* filename, int _crc){
34
38
 
35
39
  int skip = 0;
@@ -74,6 +78,8 @@
74
78
 
75
79
  while(1){
76
80
 
81
+ char status;
82
+
77
83
  printf("Waiting for sender ping ...");
78
84
 
79
85
  fflush(stdout);
@@ -84,7 +90,7 @@
84
90
 
85
91
  if(_crc){
86
92
 
87
- printf("Send C ping....");
93
+ printf("Send C ping....\n");
88
94
 
89
95
  ret = write(serial_fd, &sdCRC, sizeof(sdCRC));
90
96
 
@@ -92,18 +98,28 @@
92
98
 
93
99
  // send NAK before read SOH
94
100
 
95
- printf("Send NAK ping....");
101
+ printf("Send NAK ping....\n");
96
102
 
97
103
  ret = write(serial_fd, &sdNAK, sizeof(sdNAK));
98
104
 
99
105
  } // after sending NAK,receiving SOH from chunk
100
106
 
107
+ fflush(stdout);
108
+
101
109
  ret = read(serial_fd, &recSTX, sizeof(recSTX));
102
110
 
111
+
112
+
113
+ printf("STX is %c\n", &recSTX);
114
+
115
+ fflush(stdout);
116
+
103
117
  if (ret != sizeof(recSTX)) {
104
118
 
105
119
  printf("Not working");
106
120
 
121
+ fflush(stdout);
122
+
107
123
  perror("read");
108
124
 
109
125
  return -errno;
@@ -118,6 +134,10 @@
118
134
 
119
135
  ret = read(serial_fd, &recBlk, sizeof(recBlk));
120
136
 
137
+ printf("Block Num is %c\n", &recBlk);
138
+
139
+ fflush(stdout);
140
+
121
141
  if (ret != sizeof(recBlk)) {
122
142
 
123
143
  perror("read");
@@ -128,6 +148,10 @@
128
148
 
129
149
  ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
130
150
 
151
+ printf("Negative Block Num is %c\n", &recNegBlk);
152
+
153
+ fflush(stdout);
154
+
131
155
  if (ret != sizeof(recNegBlk)) {
132
156
 
133
157
  perror("read");
@@ -136,7 +160,11 @@
136
160
 
137
161
  }
138
162
 
139
- ret = read(serial_fd, &recData, sizeof(recData));
163
+ ret = read(serial_fd, (void *)&recData, sizeof(recData));
164
+
165
+ printf("Data buffer is %c\n", &recData);
166
+
167
+ fflush(stdout);
140
168
 
141
169
  if (ret != sizeof(recData)) {
142
170
 
@@ -148,6 +176,10 @@
148
176
 
149
177
  ret = read(serial_fd, &recChksum, sizeof(recChksum));
150
178
 
179
+ printf("Check sum is %c", &recChksum);
180
+
181
+ fflush(stdout);
182
+
151
183
  if (ret != sizeof(recChksum)) {
152
184
 
153
185
  perror("read");
@@ -234,6 +266,8 @@
234
266
 
235
267
  }
236
268
 
269
+
270
+
237
271
  ```
238
272
 
239
273
  main関数
@@ -242,6 +276,8 @@
242
276
 
243
277
 
244
278
 
279
+
280
+
245
281
  int main(int argc, char **argv)
246
282
 
247
283
  {
@@ -290,4 +326,6 @@
290
326
 
291
327
  }
292
328
 
329
+
330
+
293
331
  ```

3

文法変えた

2017/01/07 08:42

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  作成した関数なのですが、途中で何故か終了してしまいます。
10
10
 
11
- "Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、送信側はファイルの送信を行っているようなのですが
11
+ 受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
12
12
 
13
13
  ![イメージ説明](fc19dd9a69375554f8ef9ddb44aafeeb.png)
14
14
 

2

タグの追加

2017/01/07 04:45

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
File without changes

1

修正

2017/01/07 04:30

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,8 @@
24
24
 
25
25
 
26
26
 
27
+ 全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
28
+
27
29
  わたしが実装した関数
28
30
 
29
31
  ```c++