Serial data 수신
글쓴이: papablue / 작성시간: 화, 2008/10/21 - 11:23오전
안녕하세요. 프로그램 초보입니다.
Serial data를 송수신하는 프로그램을 짜고 있는데요
송신쪽은 VC++로 구현한 open source를 사용하고 있구요
수신쪽을 구현하고 있는데
송신하는 데이터가 6byte와 32byte짜리가 있습니다.
6byte의 경우 문제없이 수신이 되지만 32byte를 송신할 경우
수신쪽에서 7byte밖에 수신하지 못하고 있습니다.
== 송신쪽 source (많이들 보셨을 그 프로그램입니다)
DWORD CCommThread::WriteComm(UCHAR *pBuff, DWORD nToWrite) { DWORD dwWritten, dwError, dwErrorFlags; COMSTAT comstat; CString tempStr; //--> 포트가 연결되지 않은 상태이면.. if( !m_bConnected ) { return 0; } //--> 인자로 들어온 버퍼의 내용을 nToWrite 만큼 쓰고.. 쓴 갯수를.,dwWrite 에 넘김. if( !WriteFile( m_hComm, pBuff, nToWrite, &dwWritten, &m_osWrite)) { tempStr.Format("dwWrite = %d, pBuff = %x, nToWrite = %d", dwWritten, pBuff[8], nToWrite); //AfxMessageBox(tempStr); //--> 아직 전송할 문자가 남았을 경우.. if (GetLastError() == ERROR_IO_PENDING) { // 읽을 문자가 남아 있거나 전송할 문자가 남아 있을 경우 Overapped IO의 // 특성에 따라 ERROR_IO_PENDING 에러 메시지가 전달된다. //timeouts에 정해준 시간만큼 기다려준다. while (! GetOverlappedResult( m_hComm, &m_osWrite, &dwWritten, TRUE)) { dwError = GetLastError(); if (dwError != ERROR_IO_INCOMPLETE) { ClearCommError( m_hComm, &dwErrorFlags, &comstat); break; } } } else { dwWritten = 0; ClearCommError( m_hComm, &dwErrorFlags, &comstat); } } //--> 실제 포트로 쓰여진 갯수를 리턴.. return dwWritten; }
이 open source에서는 데이터를 8byte씩 끊어 보내기 때문에 32byte를 보낼때에는
for로 4번 호출되게 됩니다.
=== 수신쪽 source (QNX)
int read_Serial(int serial_fd, unsigned char *ret_buf) { char read_buf[40]; int iRet = -1; memset(read_buf, 0x00, sizeof(read_buf)); iRet = readcond(serial_fd, read_buf, 32, 6, 0.1, 0.3); if (iRet <0) { printf("failed to read serial data\n"); return iRet; } memcpy(ret_buf, read_buf, sizeof(read_buf)); return iRet; }
32byte의 data를 송신쪽에서 send했을 때 수신부에서 data를 printf해보게 되면
수신쪽에서는 7byte밖에 print하지 못합니다.
readcond()함수 사용의 잘못인지 serial port의 initialize에서 세팅을 해야 하는지
송신측의 문제인지 알지 못하겠습니다.
고수님들의 조언 부탁드립니다.
Forums:
당연한 결과인듯
Overlapped I/O인지 아닌지가 중요한 것이겠네요.
blocked I/O를 사용해서, &m_osWrite 위치에 NULL을 넣어주고,
dwWritten들의 합이 nToWrite이 될때까지, WriteFile()을 while문으로 돌리는 것은 어떨까요?
실제로 전송하는 부분에서..
아래와 같이 8Byte씩 끊어서 WriteComm을 호출하고 있습니다.
이것과 상관없이 WriteFile()을 while로 돌리는 것이 맞는 것인지요?
결정을 하셔야 한다는...
먼저, Overlapped I/O를 사용하셔야 하는지 아닌지를 결정하시는 것이 좋을 듯 합니다.
BTW,
etc변수는 뭐죠?
win32는 잘 모르지만...
8byte씩 보낸다고 꼭 8byte씩 전송되는지...
받는 쪽에서는 꼭 8byte씩 받는지...
-------------
포탈이는 불사신
-------------
포탈이는 불사신
댓글 달기