Serial data 수신

papablue의 이미지

안녕하세요. 프로그램 초보입니다.
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에서 세팅을 해야 하는지
송신측의 문제인지 알지 못하겠습니다.

고수님들의 조언 부탁드립니다.

drinkme의 이미지

Overlapped I/O인지 아닌지가 중요한 것이겠네요.

blocked I/O를 사용해서, &m_osWrite 위치에 NULL을 넣어주고,
dwWritten들의 합이 nToWrite이 될때까지, WriteFile()을 while문으로 돌리는 것은 어떨까요?

papablue의 이미지

아래와 같이 8Byte씩 끊어서 WriteComm을 호출하고 있습니다.
이것과 상관없이 WriteFile()을 while로 돌리는 것이 맞는 것인지요?

for(j =0; j < bufPos-etc; j+= 8)//8의 배수 보냄
{
	m_ComuPort.WriteComm(&Send_buff[j], 8) ;
}
 
if(etc != 0)//나머지 데이터 전송
{
	m_ComuPort.WriteComm(&Send_buff[bufPos -etc], etc) ;// 포트에 데이터 쓰기 
}

drinkme의 이미지

먼저, Overlapped I/O를 사용하셔야 하는지 아닌지를 결정하시는 것이 좋을 듯 합니다.

BTW,
etc변수는 뭐죠?

pizza1977의 이미지

8byte씩 보낸다고 꼭 8byte씩 전송되는지...
받는 쪽에서는 꼭 8byte씩 받는지...

-------------
포탈이는 불사신

-------------
포탈이는 불사신

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.