안녕하세요. MFC를 이용해 시리얼 통신을 구현하고 있습니다. 헌데 어려움을 겪고 있습니다.
void Cuart_ctrlDlg::OnBnClickedBtSend()
{
char buffer[MAX_COLS];
char buffer21[MAX_COLS]; //x축 pulse 버퍼 저장 어레이
char buffer22[MAX_COLS]; //y축 pulse 버퍼 저장 어레이
char buffer23[4] = "100"; //z축은 일정하게 100개의 펄스를 넘겨준다.
char buffer3[2];
char arx[MAX_COLS]; //상대좌표 계산하기 위한 x축어레이
char ary[MAX_COLS]; //상대좌표 계산하기 위한 y축어레이
char arz[MAX_COLS]; //상대좌표 계산하기 위한 z축어레이
float buffer_num = 0;
float buffer_numx = 0; //x축 pulse 갯수
float buffer_numy = 0; //y축 pulse 갯수
float buffer_numz = 0; //z축 pulse 갯수
int x, y, z = 0;
int j = 1;
int p = 1;
int q = 1;
string strx, stry;
char enter[2] = "t"; //개행을 나타내기 위함 임시 변수
char xp[2] = "a"; //x축 양의 방향
char xn[2] = "b"; //x축 음의 방향
char yp[2] = "c"; //y축 양의 방향
char yn[2] = "d"; //y축 음의 방향
char zp[2] = "e"; //z축 양의 방향
char zn[2] = "f"; //z축 음의 방향
//test라는 파일을 open한다.
FILE* input = fopen(test, "r");
memset(buffer, 0, MAX_LENGTH);
if (input == NULL){
puts("File opening error");
exit(1);
}
while (fgets(buffer, sizeof(buffer), input) != NULL) {
if (data[0] == 'a'){ //초기 data값을 r로 설정하여 맨 처음 줄을 송신 한 후, fpga에서 r을 받으면 다시 송신.
memset(data, 'a', sizeof(data)); //fpga에서 data를 받은 후 while문을 돌 때마다 data array를 초기화 시켜주어 한줄씩 전송.
ptr = strtok(buffer, " "); //buffer 문자열을 띄어쓰기 단위로 pointer로 잘라서 나타냄.
buffer3[0] = *ptr; //buffer3[0]에 ptr을 저장해 맨 처음 문자를 식별.
if (buffer3[0] == 'X'){
arx[0] = 0; //arx[0]=0으로 초기화 하여 상대 좌표 값을 계산함.
buffer_num = atoi(ptr + 1); //축 이외의 pulse 갯수만을 계산하기 위함.
arx[j] = buffer_num;
buffer_numx = arx[j] - arx[j - 1];
buffer_numx = (buffer_numx * 1000) / 6.67; //pulse 갯수 계산식
_itoa(buffer_numx, buffer21, 10);
strx = buffer21;
if (strx == "")break;
// X축으로의 양의방향인지 음의 방향인지를 나타냄.
if (buffer_numx > 0){
str = xp;
m_comm->Send(str, str.GetLength());
}
else if (buffer_numx < 0){
str = xn;
m_comm->Send(str, str.GetLength());
}
for (x = 0; x < strlen(buffer21); x++){
str = buffer21[x];
if (x == strlen(buffer21)){
break;
}
m_comm->Send(str, str.GetLength());
}
j++;
// X 축으로의 송신이 끝난 후 Y축 및 Z축으로의 송신이 있다면 진행.
while (ptr = strtok(NULL, " ")){
buffer3[0] = *ptr;
if (buffer3[0] == 'Z')
{
str = zp;
m_comm->Send(str, str.GetLength());
for (z = 0; z < strlen(buffer23); z++){
str = buffer23[z];
m_comm->Send(str, str.GetLength());
}
}
else if (buffer3[0] == 'Y'){
ary[0] = 0;
buffer_num = atoi(ptr + 1);
ary[p] = buffer_num;
buffer_numy = ary[p] - ary[p - 1];
buffer_numy = (buffer_numy * 1000) / 6.67;
_itoa(buffer_numy, buffer22, 10);
stry = buffer22;
if (stry == "")break;
if (buffer_numy > 0){
str = yp;
m_comm->Send(str, str.GetLength());
}
else if (buffer_numx < 0){
str = yn;
m_comm->Send(str, str.GetLength());
}
for (y = 0; y < strlen(buffer22); y++){
str = buffer22[y];
if (y == strlen(buffer22)){
break;
}
m_comm->Send(str, str.GetLength());
}
p++;
}
}
}
str = enter;
m_comm->Send(str, str.GetLength());
//Sleep(5000);
m_comm->Receive(data, 2);
} // if (data[0] == 'r')과 상응하는 괄호
}
fclose(input);
}
코드는 위와 같고 m_comm->Receive의 맨 아래 함수에서 fpga에서 계속 데이터를 받아와야 하는데 그게 잘 안되네요. 왜 그런거죠?
제발 답변 해 주시면 감사하겠습니다...
fpga보드와의 클락 문제인지 도무지 모르겠습니다...