8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
4
5
6
7
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rspackage_dle.h>
char *rs_error_string( void)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
8
9
10
|
@brief ini_error_code에 대한 에러 설명 문자열을 반환
@return 에러 코드에 대한 에러 설명 문자열 포인터
@warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
|
8c2952457
김태훈
응용 프로그램 추가
|
11
12
|
*/
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
13
14
15
16
|
char *error_string[] ={ "에러 없음", // RSERR_NONE
"메모리 부족", // RSERR_OUT_OF_MEMORY
"CRC 에러", // RSERR_CRC
"자료 구조 이상" // RSERR_DATA
|
8c2952457
김태훈
응용 프로그램 추가
|
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
|
};
return( error_string[rspackage_error_code]);
}
char *rs_put_dle( rs_dle_t *dle, char *data, int size)
{
char datum;
int col;
int ndx;
int branch;
branch = __WAIT_DLE;
col = 0;
for ( ndx = 0; ndx < size; ndx++)
{
datum = *data++;
switch( branch)
{
case __WAIT_DLE :
if ( dle->ch_dle == datum)
{
branch = __WAIT_STX;
}
break;
case __WAIT_STX :
if ( dle->ch_stx == datum)
{
branch = __RCV_DATA;
}
else
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
50
|
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
|
8c2952457
김태훈
응용 프로그램 추가
|
51
|
rspackage_error_code = RSERR_DATA;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
52
|
return data; // 지금까지 처리한 이후의 포인터를 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
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
|
}
break;
case __RCV_DATA :
if ( dle->ch_dle == datum)
{
branch = __CHK_DLE;
}
else
{
dle->buffer[col++] = datum;
}
break;
case __CHK_DLE :
if ( dle->ch_dle == datum)
{
dle->buffer[col++] = dle->ch_dle;
branch = __RCV_DATA;
}
else if ( dle->ch_etx == datum)
{
dle->sz_data = col;
if ( dle->check_crc( dle))
{
return data;
}
else
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
80
|
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
|
8c2952457
김태훈
응용 프로그램 추가
|
81
82
83
84
|
rspackage_error_code = RSERR_CRC;
}
return data;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
85
|
else // DLE 다음에 와서는 안되는 코드가 왔으므로 실표로 반한
|
8c2952457
김태훈
응용 프로그램 추가
|
86
|
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
87
|
dle->sz_data = -1; // CRC 에러 또는 데이터 이상
|
8c2952457
김태훈
응용 프로그램 추가
|
88
|
rspackage_error_code = RSERR_DATA;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
89
|
return data; // 지금까지 처리한 이후의 포인터를 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
90
91
92
93
|
}
break;
} // switch()
} // for {}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
94
|
dle->sz_data = 0; // 수신된 데이터가 없음
|
8c2952457
김태훈
응용 프로그램 추가
|
95
|
rspackage_error_code = RSERR_NONE;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
96
|
return data; // 지금까지 처리한 이후의 포인터를 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
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
|
}
rs_dle_t *rs_create_dle( int (*check_crc)( rs_dle_t *))
{
rs_dle_t *dle;
dle = ( rs_dle_t *)malloc( sizeof( rs_dle_t));
if ( NULL == dle)
{
rspackage_error_code = RSERR_OUT_OF_MEMORY;
return NULL;
}
dle->ch_stx = 0x02;
dle->ch_etx = 0x03;
dle->ch_dle = 0x10;
dle->check_crc = check_crc;
rspackage_error_code = RSERR_NONE;
return dle;
}
int rs_make_packet( rs_dle_t *dle, char *dst_buf, char *src_buf, int src_cnt )
{
int loop;
char *dst, *src;
dst = dst_buf;
src = src_buf;
*dst++ = dle->ch_dle;
*dst++ = dle->ch_stx;
for( loop=0; loop<src_cnt; loop++ )
{
if ( *src == dle->ch_dle )
{
*dst++ = dle->ch_dle;
}
*dst++ = *src++;
}
*dst++ = dle->ch_dle;
*dst++ = dle->ch_etx;
return dst - dst_buf;
}
|