質問編集履歴
7
タイトルの編集
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
c++によるXMODEM
|
1
|
+
c++によるXMODEMの受信関数を作っているが、dataの読み込みする前に終了する
|
body
CHANGED
File without changes
|
6
デバッグにおける修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -6,12 +6,16 @@
|
|
6
6
|
受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
|
7
7
|

|
8
8
|
受信側のxmodem_receiveはそこで終了します。
|
9
|
-

|
10
10
|
データの受信を続けたいのですが、
|
11
|
-
肝心のデータ受信部分
|
11
|
+
肝心のデータ受信部分が動作しません。
|
12
|
+
データを受け取らずに終了してしまいます。
|
13
|
+
プログラムの構成がいけないのでしょうか
|
14
|
+
また、STKを
|
15
|
+
データから受信する際にprintfで出力したら
|
16
|
+
if文の(recSTX == X_STX)で通るにもかかわらず
|
17
|
+
’K’と出てくるのはなぜなのでしょうか。
|
12
18
|
|
13
|
-
エラーハンドリングと関数についてのアドバイスの方おねがいします。
|
14
|
-
|
15
19
|
ご教授お願いします
|
16
20
|
|
17
21
|
全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
|
@@ -56,7 +60,12 @@
|
|
56
60
|
fflush(stdout);
|
57
61
|
ret = read(serial_fd, &recSTX, sizeof(recSTX));
|
58
62
|
|
63
|
+
|
64
|
+
if(recSTX == X_STX){
|
59
|
-
|
65
|
+
printf("STX is %c\n", &recSTX);
|
66
|
+
}else{
|
67
|
+
printf("Garabage payload %c\n", &recSTX);
|
68
|
+
}
|
60
69
|
fflush(stdout);
|
61
70
|
if (ret != sizeof(recSTX)) {
|
62
71
|
printf("Not working");
|
@@ -68,14 +77,14 @@
|
|
68
77
|
|
69
78
|
//So next, receiving blk
|
70
79
|
ret = read(serial_fd, &recBlk, sizeof(recBlk));
|
71
|
-
printf("Block Num is %
|
80
|
+
printf("Block Num is %d\n", recBlk);
|
72
81
|
fflush(stdout);
|
73
82
|
if (ret != sizeof(recBlk)) {
|
74
83
|
perror("read");
|
75
84
|
return -errno;
|
76
85
|
}
|
77
86
|
ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
|
78
|
-
printf("Negative Block Num is %
|
87
|
+
printf("Negative Block Num is %d\n", recNegBlk);
|
79
88
|
fflush(stdout);
|
80
89
|
if (ret != sizeof(recNegBlk)) {
|
81
90
|
perror("read");
|
@@ -138,12 +147,20 @@
|
|
138
147
|
```
|
139
148
|
main関数
|
140
149
|
```c++
|
141
|
-
|
142
|
-
|
143
150
|
int main(int argc, char **argv)
|
144
151
|
{
|
145
152
|
int a, ret, serial_fd;
|
146
153
|
|
154
|
+
printf("STX: %c\n", X_STX);
|
155
|
+
|
156
|
+
printf("ACK: %c\n", X_ACK);
|
157
|
+
|
158
|
+
printf("NAK: %c\n", X_NAK);
|
159
|
+
|
160
|
+
printf("EOF: %c\n", X_EOF);
|
161
|
+
|
162
|
+
fflush(stdout);
|
163
|
+
|
147
164
|
serial_fd = open_serial("/dev/ttyUSB0", 115200);
|
148
165
|
if (serial_fd < 0)
|
149
166
|
return -errno;
|
@@ -165,4 +182,5 @@
|
|
165
182
|
return 0;
|
166
183
|
}
|
167
184
|
|
185
|
+
|
168
186
|
```
|
5
文章の変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,8 +8,10 @@
|
|
8
8
|
受信側のxmodem_receiveはそこで終了します。
|
9
9
|

|
10
10
|
データの受信を続けたいのですが、
|
11
|
-
|
11
|
+
肝心のデータ受信部分で"Invalid argument"が出力されてしまいます。
|
12
12
|
|
13
|
+
エラーハンドリングと関数についてのアドバイスの方おねがいします。
|
14
|
+
|
13
15
|
ご教授お願いします
|
14
16
|
|
15
17
|
全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
|
4
コードと画像の追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,8 +4,9 @@
|
|
4
4
|
こちらのコードですが、ここ(https://gist.github.com/zonque/0ae2dc8cedbcdbd9b933)のサイトのコードを元に、xmodem_receiveという関数を新たに実装し,XMODEMのデータ受信をしたいと思っております。
|
5
5
|
作成した関数なのですが、途中で何故か終了してしまいます。
|
6
6
|
受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
|
7
|
-

|
8
8
|
受信側のxmodem_receiveはそこで終了します。
|
9
|
+

|
9
10
|
データの受信を続けたいのですが、
|
10
11
|
この関数のどこらへんがおかしいのでしょうか。
|
11
12
|
|
@@ -14,6 +15,7 @@
|
|
14
15
|
全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
|
15
16
|
わたしが実装した関数
|
16
17
|
```c++
|
18
|
+
|
17
19
|
static int xmodem_receive(int serial_fd, char* filename, int _crc){
|
18
20
|
int skip = 0;
|
19
21
|
uint8_t sdCRC = 'C';
|
@@ -36,21 +38,27 @@
|
|
36
38
|
fp = fopen(filename, "wb");
|
37
39
|
//Send NAK still read SOH that header of one data chunks
|
38
40
|
while(1){
|
41
|
+
char status;
|
39
42
|
printf("Waiting for sender ping ...");
|
40
43
|
fflush(stdout);
|
41
44
|
//
|
42
45
|
do {
|
43
46
|
if(_crc){
|
44
|
-
printf("Send C ping....");
|
47
|
+
printf("Send C ping....\n");
|
45
48
|
ret = write(serial_fd, &sdCRC, sizeof(sdCRC));
|
46
49
|
}else{
|
47
50
|
// send NAK before read SOH
|
48
|
-
printf("Send NAK ping....");
|
51
|
+
printf("Send NAK ping....\n");
|
49
52
|
ret = write(serial_fd, &sdNAK, sizeof(sdNAK));
|
50
53
|
} // after sending NAK,receiving SOH from chunk
|
54
|
+
fflush(stdout);
|
51
55
|
ret = read(serial_fd, &recSTX, sizeof(recSTX));
|
56
|
+
|
57
|
+
printf("STX is %c\n", &recSTX);
|
58
|
+
fflush(stdout);
|
52
59
|
if (ret != sizeof(recSTX)) {
|
53
60
|
printf("Not working");
|
61
|
+
fflush(stdout);
|
54
62
|
perror("read");
|
55
63
|
return -errno;
|
56
64
|
}
|
@@ -58,21 +66,29 @@
|
|
58
66
|
|
59
67
|
//So next, receiving blk
|
60
68
|
ret = read(serial_fd, &recBlk, sizeof(recBlk));
|
69
|
+
printf("Block Num is %c\n", &recBlk);
|
70
|
+
fflush(stdout);
|
61
71
|
if (ret != sizeof(recBlk)) {
|
62
72
|
perror("read");
|
63
73
|
return -errno;
|
64
74
|
}
|
65
75
|
ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
|
76
|
+
printf("Negative Block Num is %c\n", &recNegBlk);
|
77
|
+
fflush(stdout);
|
66
78
|
if (ret != sizeof(recNegBlk)) {
|
67
79
|
perror("read");
|
68
80
|
return -errno;
|
69
81
|
}
|
70
|
-
ret = read(serial_fd, &recData, sizeof(recData));
|
82
|
+
ret = read(serial_fd, (void *)&recData, sizeof(recData));
|
83
|
+
printf("Data buffer is %c\n", &recData);
|
84
|
+
fflush(stdout);
|
71
85
|
if (ret != sizeof(recData)) {
|
72
86
|
perror("read");
|
73
87
|
return -errno;
|
74
88
|
}
|
75
89
|
ret = read(serial_fd, &recChksum, sizeof(recChksum));
|
90
|
+
printf("Check sum is %c", &recChksum);
|
91
|
+
fflush(stdout);
|
76
92
|
if (ret != sizeof(recChksum)) {
|
77
93
|
perror("read");
|
78
94
|
return -errno;
|
@@ -116,10 +132,12 @@
|
|
116
132
|
return 0;
|
117
133
|
|
118
134
|
}
|
135
|
+
|
119
136
|
```
|
120
137
|
main関数
|
121
138
|
```c++
|
122
139
|
|
140
|
+
|
123
141
|
int main(int argc, char **argv)
|
124
142
|
{
|
125
143
|
int a, ret, serial_fd;
|
@@ -144,4 +162,5 @@
|
|
144
162
|
|
145
163
|
return 0;
|
146
164
|
}
|
165
|
+
|
147
166
|
```
|
3
文法変えた
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
引き続きよろしくお願いします。
|
4
4
|
こちらのコードですが、ここ(https://gist.github.com/zonque/0ae2dc8cedbcdbd9b933)のサイトのコードを元に、xmodem_receiveという関数を新たに実装し,XMODEMのデータ受信をしたいと思っております。
|
5
5
|
作成した関数なのですが、途中で何故か終了してしまいます。
|
6
|
-
"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、送信側はファイルの送信を行っているようなのですが
|
6
|
+
受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
|
7
7
|

|
8
8
|
受信側のxmodem_receiveはそこで終了します。
|
9
9
|
データの受信を続けたいのですが、
|
2
タグの追加
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
1
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
|
12
12
|
ご教授お願いします
|
13
13
|
|
14
|
+
全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
|
14
15
|
わたしが実装した関数
|
15
16
|
```c++
|
16
17
|
static int xmodem_receive(int serial_fd, char* filename, int _crc){
|