디시인사이드 갤러리

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

갤러리 본문 영역

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

C언어초보(220.76) 2009.09.21 17:35:00
조회 89 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
278344 대학이 그렇게 중요한 건지 몰랐다.jpg [3] ㅁㄴㅇㄹ(121.133) 11.10.05 171 0
278343 C++ 문제에서 막히네요;; [6] 공부중임(203.241) 11.10.05 167 0
278341 오페라는 별걸 다 꾸겨넣었넹 [2] 시불라미갤로그로 이동합니다. 11.10.05 58 0
278340 오늘따라 퇴근후 더 썰렁하네(뒤조심) blackd갤로그로 이동합니다. 11.10.05 87 0
278339 니들 아직 동정이냐? [3] lol(121.182) 11.10.05 83 0
278338 건전하게들 살아라 쉑이드라. [9] 쵸쵸(219.251) 11.10.05 170 0
278337 리눅스에서 윈도우 어플 돌릴라는건 무슨 심보임? [5] 로하로하알로하갤로그로 이동합니다. 11.10.05 88 0
278335 도스 시절 웹 브라우저나 CLI에서 돌아가는 브라우저 아는사람? [3] 로하로하알로하갤로그로 이동합니다. 11.10.05 69 0
278334 엘리베이터 [2] 3(116.42) 11.10.05 83 0
278333 노트북살거에옇ㅎ늅늅 [3] 즐쿰갤로그로 이동합니다. 11.10.05 86 0
278331 웹에서의 성패는 기술이 아니다. 감성이다. [2] 쵸쵸(219.251) 11.10.05 65 0
278329 아 더블릿 좀 풀어봐야 하나 ㅋ [성대아싸]갤로그로 이동합니다. 11.10.05 68 0
278328 아 ㅡㅡ 리눅스에서 네이트온 어떻게 받음? [2] 233(118.34) 11.10.05 67 0
278327 win api 캐늅늅인데 질문점 [5] geck갤로그로 이동합니다. 11.10.05 78 0
278326 여자친구랑 완전히쫑낫는데 [2] ㅇㅇ(58.127) 11.10.05 97 0
278325 php 게시판에서여 [2] ㅇㅇ(220.94) 11.10.05 57 0
278324 8개월차에 접어드는 자바개발자 [10] 한번쯤(59.5) 11.10.05 189 0
278322 솔직히 이쪽 계열 번역가중 최고는 류광아니냐? [2] Deanex갤로그로 이동합니다. 11.10.05 75 0
278321 소년이여 꿈을 꾸어라!!! 쵸쵸(219.251) 11.10.05 50 0
278320 c++ 초보인데요 물어볼께있어요 ㅠㅠ cin을 만들라고하는데 [3] kingbye갤로그로 이동합니다. 11.10.05 104 0
278319 렉스 다룰줄 아는형들 급한데 헬프점;; ㅈㅈㅈㅈ(118.47) 11.10.05 36 0
278318 프갤 형들 정말 감사하구여. 마지막 하나만 더 묻겠습니다 [7] 산울림.갤로그로 이동합니다. 11.10.05 70 0
278315 광화문쪽에서 일하는횽있어? [2] 三didas갤로그로 이동합니다. 11.10.05 78 0
278314 MIPS 질문입니다 도와주세요 형님들 [7] 123(210.218) 11.10.05 132 0
278313 대학도서관인데고딩많음늅늅 [4] 즐쿰갤로그로 이동합니다. 11.10.05 100 0
278312 교내 산학협력업체에서 일하면 좋은게 laoshanlong갤로그로 이동합니다. 11.10.05 53 0
278311 형들 궁금해서 그런데.. 여기도 학과같은거 많이 따져? [5] Aven(115.23) 11.10.05 99 0
278310 내가해본공부중 최고다 [1] 三didas갤로그로 이동합니다. 11.10.05 112 0
278307 프갤형들 질문 하나만 더 봐주세요 ㅠㅠ [7] 산울림.갤로그로 이동합니다. 11.10.05 73 0
278302 프로그래밍 하기는 영어가 젤 좋은듯 [3] 금고래갤로그로 이동합니다. 11.10.05 83 0
278301 쿠캬캬 횽 말이 맞음 [3] 어떡해갤로그로 이동합니다. 11.10.05 83 0
278297 프갤형들 C언어 초짜 질문 점;; [4] 산울림.갤로그로 이동합니다. 11.10.05 83 0
278296 캐꼬꼬닭 [5] 얼호야(115.92) 11.10.05 68 0
278294 결국 내친구 뚤었네 2600에 [13] 좋은아버지갤로그로 이동합니다. 11.10.05 292 0
278293 내가 처음 본격적으로 플밍 공부한 계기 [3] monoless갤로그로 이동합니다. 11.10.05 103 0
278292 컴공과에도 밝은 전망이 있음? [1] asfaf(182.209) 11.10.05 127 0
278291 한혜진 조개 오픈 [3] iljeomobolt갤로그로 이동합니다. 11.10.05 201 0
278290 공부할때 기본적으로 추천코스는 [4] madcat_mk2갤로그로 이동합니다. 11.10.05 114 0
278288 갤에 고수는 필요없다. [1] 로하로하알로하갤로그로 이동합니다. 11.10.05 51 0
278287 jai guru deva om abbey road갤로그로 이동합니다. 11.10.05 32 0
278286 난 학원 반댈세 [1] 전간디갤로그로 이동합니다. 11.10.05 121 0
278285 내가 학원 다녀봣는데 [7] 로하로하알로하갤로그로 이동합니다. 11.10.05 164 0
278284 프갤러님들 만약 과를 옮기게 된다면 옮기실건가요? [1] 한양인데엘카(175.114) 11.10.05 64 0
278283 여기 프로그래밍 혼자서 책보고 공부한 형 있어? [6] 얼빠진호랑이갤로그로 이동합니다. 11.10.05 187 0
278282 반명함판 사진만드는법좀 알려주세요 ㅠㅠ bb(211.202) 11.10.05 260 0
278281 nhn 채용 결과 일찍나온사람뭐고 늦게 나온사람 뭐임????? ㅁㄴㅇㄹ(115.137) 11.10.05 110 0
278280 씨언어 문제집이라니 이게 바로 [24] 로하로하알로하갤로그로 이동합니다. 11.10.05 296 0
278279 프갤엔 고수가 잇지만 [4] 로하로하알로하갤로그로 이동합니다. 11.10.05 95 0
278278 프갤러들아 나에게 힘을줘 [7] laoshanlong갤로그로 이동합니다. 11.10.05 93 0
278277 솔직히 난 그래 [4] 얼빠진호랑이갤로그로 이동합니다. 11.10.05 110 0
뉴스 “역시 부자는 다르다”…서장훈, ‘재혼’ 이상민에 ‘헉’ 소리 나는 축의금 디시트렌드 07.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2