[시리얼통신]수신측에서 데이타를 이상하게 받습니다.
글쓴이: neverdie / 작성시간: 목, 2005/03/24 - 8:22오후
시리얼 통신을 처음 접하는 초보입니다.
궁금한게 있어 질문드립니다.
//송신 struct _Single { uchar _address; // 1 binary uchar _command; // 1 binary unsigned int _Value; // 4 BCD 00000000~99999999 unsigned short _CRC; // CRC-CCITT }; _Single sm; sm._address = 0x01; sm._command = '?'; sm._Value = 0; sm._CRC = 0; pSerial->SendData(&sm, sizeof(_Single) ); /* int CSerial::SendData(void* pData, int iLen) { int nSendLen = 0; nSendLen = write( m_iFD, pData, iLen ); return nSendLen; } */ // 시뮬레이터 수신데이타 01 3F 40 50 20 20 10 10 08 08 04 FC
---------------------------------
제 생각에는
01 3F 00 00 00 00 00 00
이렇게 수신될줄 알았는데...
0을 보내는거라서... htonl, htons는 사용을 안했습니다.
왜 그런건가요?
Forums:
일단 한 원인은 구조체에서 패딩이 일어나기 때문입니다. (패딩, alig
일단 한 원인은 구조체에서 패딩이 일어나기 때문입니다. (패딩, align, 정렬 등으로 검색해보시면 참고하실만한 글들이 나올 듯 합니다.)
&sm 의 내용을 바이트 단위로 찍어보면
0x01 0x3F 0x?? 0x?? 0x00 0x00 0x00 0x00 0x00 0x00 0x?? 0x??
_address 0x01
_command 0x3F
padding[2] 0x?? 0x??
_Value 0x00 0x00 0x00 0x00
_CRC 0x00 0x00 0x?? 0x??
이 됩니다. (컴파일러나 플랫폼에 따라 달라질 수도 있습니다.)
sizeof(_Single)가 8bytes가 아닌 12bytes가 된 것도 같은 이유때문입니다.
0x?? 라고 한 건, 그 부분에는 쓰레기 값이 들어갈 수 있기 때문입니다.
0일 수도 있고 아닐 수도 있죠.
그래서 구조체 변수를 포인터로 캐스팅해서 구조체 크기만큼 보내는 건, 좋은 방법이 안됩니다.
근데, 0x00이 나와야 할 부분들이 다른 값들이 나오는건 -_-; 솔직히 이해가 안 되는군요.
노이즈가 생긴 건지 아니면 보내기 전이나 보내는 과정에서 침범이 생겨 그런건지...
보내기 전에 로그라고 찍어서 데이터를 확인 해 보셔야 할 듯 합니다.
감사합니다.. ^^
#pragma pack(1)
을 사용했더니 8byte 송신된거로는 나오는데...
값이 계속 이상한 값이 나옵니다... ㅠ.ㅠ
현재 시뮬레이터는 윈도우에서 돌고 있고...
테스트 프로그램은 리눅스입니다.
안녕하세요~ ^^
[문제해결]c_cflag
c_cflag에다가 값을 잘못 넣었습니다.
시뮬레이터가 값을 잘못수신한게 아니였네요. ^^;;
안녕하세요~ ^^
댓글 달기