디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

잘생긴형들!!!!!!!!!!!!!!!!!!!!!!!!C언어 질문할거있는데

C언어초보(220.76) 2009.09.21 17:35:00
조회 81 추천 0 댓글 2

1:1로 진짜 친절히 알려줄수 있는 사람 있나요 ? ㅜㅜ
너무 답답합니다 ㅜ

#include <Windows.h>
#include "resource.h"

//함수원형 및 전역변수 선언
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
DWORD RecvData(LPVOID);// 수신 전용 스레드
HWND hWndMain;
HANDLE hFile;
int  nSwitch;
int  Baud=0;
DCB  dcb;
TCHAR *items[]={"1200","2400","4800","9600","19200","38400","57600","115200"};

//이름과 메시지를 함께 보낼 구조체
struct FULL

 char szId[100];//아이디 입력받을 배열

 char szBuffer[100]; //내용 저장 받을 배열 
 
};


//대화상자 생성
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrechInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWndMain, (DLGPROC)DlgProc);
 return TRUE;
}

//대화상자의 메시지를 처리할 프로시저
BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

 char szFull[500];//아이디와 내용을 연결하기 위한 배열
 char szResult[200];//현재 dcb상태 저장할 배열
 int i;//콤보박스에 항목 넣기 위해 쓰이는 변수
 switch(msg)
 {
 case WM_INITDIALOG:
  hWndMain = hWnd;
  
  //콤보박스에 items배열에 저장된 BaudRate 값들을 넣는다
  for(i=0;i<8;i++)
  {
   SendDlgItemMessage(hWndMain,ID_COMBO_BAUD,CB_ADDSTRING,0,(LPARAM)items[i]);
  }
  return TRUE;

 case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  //콤보박스에서 이벤트가 발생할 경우
  case ID_COMBO_BAUD:
   switch(HIWORD(wParam))
   {
   //콤보박스에서 BaudRate를 선택하면 리턴되는 인덱스가 Baud에 저장된다.
   case CBN_SELCHANGE:
    Baud=SendDlgItemMessage(hWndMain,ID_COMBO_BAUD,CB_GETCURSEL,0,0);
    
    break;
   }
   break;
   
  //OPEN버튼에서 이벤트가 발생할 경우
  case ID_BUTTON_OPEN:
   //수신 스레드 생성
   DWORD nThreadId;
   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, NULL, 0, &nThreadId);
   
   char SelectCom[10];//컴포트를 입력받는 에디트박스에 문자열을 저장할 배열
   
   GetDlgItemText(hWndMain , ID_EDIT_COMSET ,SelectCom,sizeof(SelectCom));//에디트박스에 입력된 문자열을 SelectCom배열로 전송
   
   //SelectCom의 문자열과 "COM3, COM4"와 비교하여 같으면 배열에 입력된 이름을 가진 포트를 연다
   //만약 실패하여 리턴값이 INVALID_HANDLE_VALUE가 나온 경우 포트를 열수없다는 메시지 박스를 연다
   if(strcmp(SelectCom,"COM3")==0||strcmp(SelectCom,"COM4")==0)
   {
     hFile = CreateFile(SelectCom,GENERIC_READ | GENERIC_WRITE,0,0, OPEN_EXISTING,0, 0 );
     
     SetDlgItemText(hWnd,ID_STATIC_STATUS, "Connected");

     if(hFile == INVALID_HANDLE_VALUE)
     {
      MessageBox(0, "Can\'t Open Port", "ERROR", MB_OK);
      SetDlgItemText(hWnd,ID_STATIC_STATUS, "DisConnected");
     }
     SetWindowText(hWndMain, SelectCom);
   }
   else
   {   
   MessageBox(hWnd , "Select COM3 or COM4" , "Error",MB_OK);
   }
   
   
   nSwitch = 1;//스레드 오픈

   //현재 설정된 dcb를 가져온뒤
   //콤보박스의 아이템을 선택할 경우 발생하는 인덱스를 비교하여
   //각각의 경우에 맞는 속도를 설정한뒤
   //포트의 핸들에 dcb정보를 보낸다
   GetCommState(hFile , &dcb);
   switch(Baud)
   {
   case 0:
    dcb.BaudRate = CBR_1200;
    break;
   case 1:
    dcb.BaudRate = CBR_2400;
    break;
   case 2:
    dcb.BaudRate = CBR_4800;
    break;
   case 3:
    dcb.BaudRate = CBR_9600;
    break;
   case 4:
    dcb.BaudRate = CBR_19200;
    break;
   case 5:
    dcb.BaudRate = CBR_38400;
    break;
   case 6:
    dcb.BaudRate = CBR_57600;
    break;
   case 7:
    dcb.BaudRate = CBR_115200;
    break;
   }

   dcb.ByteSize = 8;
   dcb.StopBits = 1;

   SetCommState(hFile , &dcb);
 
   COMMTIMEOUTS Timeout;
   GetCommTimeouts(hFile, &Timeout); 
   Timeout.ReadIntervalTimeout      = MAXDWORD;
   Timeout.ReadTotalTimeoutMultiplier  = 0;
   Timeout.ReadTotalTimeoutConstant    = 0;
   Timeout.WriteTotalTimeoutMultiplier  = 0;
   Timeout.WriteTotalTimeoutConstant    = 0;

   SetCommTimeouts(hFile, & Timeout);


   //szResult배열에 현재 설정된 dcb값들을 저장한뒤
   //화면에 출력한다
   wsprintf(szResult, "BaudRate : %d  ByteSize : %d Parity : %d StopBits : %d ",
       dcb.BaudRate, dcb.ByteSize, dcb.Parity,dcb.StopBits);
   SetDlgItemText(hWnd,ID_STATIC_RESULT, szResult);

   

   
   
   break;

   
  //SEND버튼에서 메시지가 발생한 경우
  case ID_BUTTON_SEND:
   DWORD dwByte;
   FULL full;
   //메시지를 저장한 배열, 아이디를 저장한 배열을 초기화 한다
   memset(szFull,0,sizeof(szFull));
   memset(full.szBuffer,0,sizeof(full.szBuffer));
   memset(full.szId,0,sizeof(full.szId));

   
   //메시지를 입력한 Send에디트와 아이디를 입력한Idfull에 저장된 문자열을
   //구조체의 멤버인 szBuffer와 szId에 저장한다
   GetDlgItemText(hWndMain, ID_EDIT_SEND, full.szBuffer, sizeof(full.szBuffer)); 
   GetDlgItemText(hWndMain, ID_EDIT_ID, full.szId, sizeof(full.szId));

   //szId와 szBuffer을 연결하여 szFull에 저장한다
   strcat(szFull,full.szId);
   strcat(szFull," : ");
   strcat(szFull,full.szBuffer);
   
   //szFull을 리스트박스에 나타낸다
   SendDlgItemMessage(hWndMain, ID_LIST_RECV, LB_ADDSTRING,0 ,(LPARAM)szFull);
   
   //메시지와 아이디가 입력된 값들이 저장되어있는 구조체를 송신한다
   Sleep(20);
   WriteFile(hFile, &full, sizeof(full), &dwByte,0);

   //메시지입력 에디트 박스를 초기화한다
   SetDlgItemText(hWnd,ID_EDIT_SEND, "");

   break;
  
  //CLOSE버튼에서 이벤트가 발생할 경우
  case ID_BUTTON_CLOSE:
   nSwitch = 0;//스레드 종료
   CloseHandle(hFile);//컴포트 닫기
   SetDlgItemText(hWnd,ID_STATIC_STATUS, "DisConnected");
   wsprintf(szResult, "");
   SetDlgItemText(hWnd,ID_STATIC_RESULT, szResult);
   return TRUE;

  //대화상자를 종료할 경우 
  case IDCANCEL:
   nSwitch = 0;//스레드 종료
   CloseHandle(hFile);//컴포트 닫기
   EndDialog(hWnd, 0);//대화상자 종료
   return TRUE;
  }
 }

 return FALSE;
}
//수신전용 스레드
DWORD RecvData( VOID * dummy )     
{
 
 char szFull[500];

 FULL Sendfull;


 while(1)
 {
  int  Written=0;
  DWORD nByte=0;
  Sleep(20);
  memset(szFull,0,sizeof(szFull));
  memset(Sendfull.szId,0,sizeof(Sendfull.szId));
  memset(Sendfull.szBuffer,0,sizeof(Sendfull.szBuffer));

  if(nSwitch)
  {
   ReadFile(hFile,&Sendfull,sizeof(Sendfull),&nByte,0);

   if(nByte<sizeof(Sendfull) && nByte!=0 && nByte!=sizeof(Sendfull))
   {
    Written = nByte;
    while(Written < sizeof(Sendfull))
    {   
     ReadFile(hFile,((char*)&Sendfull)+Written,sizeof(Sendfull)-Written,&nByte,0);
     Written = Written+nByte; 
    }
   }

   if(0!=nByte)
   {
    strcat(szFull,Sendfull.szId);
    strcat(szFull," : ");
    strcat(szFull,Sendfull.szBuffer);

    SendDlgItemMessage(hWndMain, ID_LIST_RECV, LB_ADDSTRING, 0,(LPARAM)szFull);
   }
  }
 }

 return 0;
}

 

-----------------------------------------------------------------------------------

 

여기까지가 소스 전문이고요

RS-232로 시리얼 통신 하는 프로그램을 만들고 있습니다

 

노란색으로 표시한 부분에서

배열을 100,100으로 잡아서 쓰고있는데

메시지를 주고 받을 때 마다 200씩 왓다갔다하니깐 효율적이지 못한것 같습니다

 

이때,

100,100이 아닌 동적배열을 이용하여

에디트 박스에 입력된 문자열 크기 만큼만 배열로 할당해서

주고 받을수 있게했으면 좋겠습니다.

 

빨간색부분이 메시지를 send하고 메시지를 recv하는 건데

이부분에서 어떻게 고쳐야하나요..?

 

malloc을 사용하여 배열의 크기를 자유자재로 움직일 수 있게 하는게 질문입니다..

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 비난 여론에도 뻔뻔하게 잘 살 것 같은 스타는? 운영자 24/06/03 - -
159455 결혼하고 난 뒤에..... [6] 써타니갤로그로 이동합니다. 09.11.28 95 0
159454 본격 마음을 정화시켜주는 고양이 짤 [3] AL갤로그로 이동합니다. 09.11.28 115 0
159452 이건 프로그래밍과 관련이 없는 글임 [3] 써타니갤로그로 이동합니다. 09.11.28 67 0
159450 참사 [2] ㅇㅇㅃ갤로그로 이동합니다. 09.11.28 60 0
159448 아직 뇨자 인증사진 못본사람 있음? [7] 케케켁켁갤로그로 이동합니다. 09.11.28 144 0
159447 난 사실 에버그린 을 스카웃 하고싶다 [5] AL갤로그로 이동합니다. 09.11.28 92 0
159446 안구정화용 [6] ㅇㅇㅃ갤로그로 이동합니다. 09.11.28 97 0
159445 주변에서 내친구들이 나 보고 [4] 써타니갤로그로 이동합니다. 09.11.28 83 0
159444 여자는 당장 프로그래밍 갤러리에서 나가는게 좋을거다 [20] AL갤로그로 이동합니다. 09.11.28 191 0
159443 아이폰 어플 대박만들면 잡스가 대려간다는게 레알? [2] 써타니갤로그로 이동합니다. 09.11.28 118 0
159439 착시현상 [3] ㅇㅇㅃ갤로그로 이동합니다. 09.11.28 67 0
159438 이런 좋은 컴포넌트가 있었다니... 귀차니즘(112.149) 09.11.28 52 0
159437 Six Sense [7] ㅇㅇㅃ갤로그로 이동합니다. 09.11.28 93 0
159435 SK 텔레콤 패닉 상태 [9] 피로토스갤로그로 이동합니다. 09.11.28 209 0
159434 ㅋㅋㅋ [1] IHF갤로그로 이동합니다. 09.11.28 51 0
159432 잘자 내꿈꿔♡ CP(118.221) 09.11.28 50 0
159431 두바이 사태 꽤 크네. [1] 알고리저(121.133) 09.11.28 65 0
159428 정전 [1] prismatic갤로그로 이동합니다. 09.11.28 34 0
159427 프로그래밍 갤러리에서 [1] 쿨돼지갤로그로 이동합니다. 09.11.28 87 0
159425 vita500 인증~ [8] Vita500갤로그로 이동합니다. 09.11.28 112 0
159423 본격 뇨자에게 잘 보이고 싶으면 이렇게 말해라 [7] 알고리저(121.133) 09.11.28 140 0
159421 temporary에 저장되있던 뇨자의 인증사진이시닷 [8] 알고리저(121.133) 09.11.28 158 0
159419 난 양복이 없는데 [4] prismatic갤로그로 이동합니다. 09.11.28 65 0
159416 이 책을 살까 말까..고민중..; [10] 레쓰비(222.109) 09.11.28 117 0
159415 아이큐 500 내머리는 계산기 [5] 111(218.48) 09.11.28 87 0
159414 컴터 졸라 빨라지는 RAMDISK라고 들어는 봤는가? [3] 고릴리아갤로그로 이동합니다. 09.11.27 117 0
159413 천재를 위해 visual c++프로그램좀 보내줄 사람????? [16] 111(218.48) 09.11.27 112 0
159412 난 프로그래밍 천재다 C++과 자바 캴캴캴 [4] 111(218.48) 09.11.27 162 0
159411 7z로 전향했는데 alz땜에 곤란한 횽들 [5] prismatic갤로그로 이동합니다. 09.11.27 81 0
159409 간단하구만 void가 반환값이 없다는 뜻이네 [13] 111(218.48) 09.11.27 214 0
159408 c++초보인데 void가 모냐???? [10] 111(218.48) 09.11.27 143 0
159407 돈 많이 벌고 싶네요 [3] AutuMn(112.160) 09.11.27 65 0
159406 음... 지금 통신 프로토콜 클래스다이어그램을 그리려고 하는데... 김가몬갤로그로 이동합니다. 09.11.27 46 0
159405 생각해보니...paypal 존나 허술하네...ㄷㄷㄷㄷㄷ [3] (115.140) 09.11.27 75 0
159404 내일 결혼식 사회보는데... [6] 물속의다이아갤로그로 이동합니다. 09.11.27 85 0
159403 정말 ctrl+c ctrl+v 수정하기 힘드네 [5] 귀차니즘(112.149) 09.11.27 62 0
159401 별이서리 [6] IHF갤로그로 이동합니다. 09.11.27 89 0
159400 C++인데요 코딩좀 도와주세요.. [18] 굽신굽신(121.139) 09.11.27 121 0
159398 c언어 도와주세요ㅠㅠ [2] ㅁㄴㅇㄹ(219.241) 09.11.27 64 0
159397 나도 대학생때 짠 계산기 프로그램이얌. 한 두달 걸렸지. [4] 씬입사원갤로그로 이동합니다. 09.11.27 129 0
159395 뒷북 떡밥, 후위표기 [3] DMW(125.138) 09.11.27 122 0
159394 내가 예전에 학교 다닐때 만든 계산기 프로그램이야.. 100라인도 안됨 [6] rntjr갤로그로 이동합니다. 09.11.27 160 0
159392 아하에너지를 능가하는 강자가 나타났다 [4] 오사카(221.153) 09.11.27 123 0
159391 뇨자얌. [13] 씬입사원갤로그로 이동합니다. 09.11.27 143 0
159390 blueblow 운영자 있음? [7] (116.37) 09.11.27 123 0
159389 뇨자 안녕 [27] 개쉛기갤로그로 이동합니다. 09.11.27 173 0
159386 나도 단어수 [5] DMW(125.138) 09.11.27 100 0
159384 단어수 출력하기? [1] IHF갤로그로 이동합니다. 09.11.27 103 0
159383 아.. GOF 디자인패턴책 절판이네.. [1] 켁큇갤로그로 이동합니다. 09.11.27 90 0
159380 폭식하고 왔엉 [5] 아주아슬갤로그로 이동합니다. 09.11.27 63 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2