한달 째 고민중인 cpp "char" 1byte send/receive 코드 질문 드립니다..ㅠㅠ
조회수 115회
안녕하세요. cpp 입문자 입니다.
맨 밑에 코드가 제가 참고한 example code 이고요. 첫번째 코드가 제가 수정한 코드 입니다.
참고한 git는 https://github.com/gbmhunter/CppLinuxSerial 입니다. '#define _SERIAL_SEND_BYTE(c) '#define _SERIAL_RECV_BYTE() 부분 에 작성된게 맞는지 모르겠어서요.. 혹시나 가능하시다면 확인 부탁드립니다ㅠㅠ
'#define _SERIAL_IS_RXBUFF_EMPTY() 부분도 작성은 해야되는데 아직 고민중이라서 이 부분은 좀 더 생각해보겠습니다
// 제가 수정한 코드
#include <CppLinuxSerial/SerialPort.hpp>
#ifndef _COMM_SETTING_H_
#define _COMM_SETTING_H_
//===========================================================================
// Serial Communication Functions
//===========================================================================
using namespace mn::CppLinuxSerial;
// Create serial port object and open serial port at 115200 buad, 8 data bits, no parity bit, one stop bit (8n1),
// and no flow control
SerialPort serialPort("/dev/ttyS0", BaudRate::B_115200, NumDataBits::EIGHT, Parity::NONE, NumStopBits::ONE);
// Use SerialPort serialPort("/dev/ttyACM0", 13000); instead if you want to provide a custom baud rate
serialPort.SetTimeout(-1); // Block when reading until any data is received
serialPort.Open();
std::string readData;
#define _SERIAL_TX_ENABLE() do{ }while(0) // Tx를 Enable하는 명령을 구현
#define _SERIAL_RX_ENABLE() do{ }while(0) // Rx를 Enable하는 명령을 구현
// send/recv
#define _SERIAL_SEND_BYTE(c) do{serialPort.Write(c);}while(0) // 'char' 1byte를 send 하는 명령을 구현
#define _SERIAL_RECV_BYTE() (serialPort.Read(readData), readData[0])
// #define _SERIAL_RECV_BYTE() (serialPort.Read(readData);) // 'char' 1byte를 receive 하는 명령을 구현
// check rx buffer
#define _SERIAL_IS_RXBUFF_EMPTY() (serialPort.Available() == 0) // Rx buffer가 비어있는지를 확인하는 명령을 구현
#endif // _COMM_SETTING_H_
// Example Code
#ifndef _COMM_SETTING_AVR128_H_
#define _COMM_SETTING_AVR128_H_
// Include definition files.
//===========================================================================
// Serial Communication Functions
//===========================================================================
// switching tx/rx
#define _SERIAL_TX_ENABLE() do{PORTE.6 = 1; PORTE.7 = 1;}while(0) // tx, rx port 설정?
#define _SERIAL_RX_ENABLE() do{PORTE.7 = 0; PORTE.6 = 0;}while(0)
// send/recv
#define _SERIAL_SEND_BYTE(c) do{while((UCSR0A&0x20) == 0x00); UDR0 = c; delay_us(100);}while(0) // send ready까지 wait?
#define _SERIAL_RECV_BYTE() (UDR0)
// check rx buffer
#define _SERIAL_IS_RXBUFF_EMPTY() ((UCSR0A&0x80) == 0x00) // data를 받을 때까지 wait?
#endif // _COMM_SETTING_AVR128_H_
1 답변
-
수정한 코드에서 SERIAL_SEND_BYTE 부분은 적절한 것 같습니다. 하지만 _SERIAL_RECV_BYTE 부분에서는 serialPort.Read를 호출하고 나서 readData[0]을 반환하는데, 이 때 readData의 크기가 0인 경우 인덱스 0에 접근하려고 하면 예외가 발생합니다. serialPort.Read가 반환하는 값을 그대로 반환하도록 다음과 같이 수정하는 것이 좋을 것 같습니다.
#define _SERIAL_RECV_BYTE() (serialPort.Read(readData), (readData.empty() ? 0 : readData[0]))
그리고 _SERIAL_IS_RXBUFF_EMPTY 부분은 다음과 같이 수정하면 될 것 같습니다.#define _SERIAL_IS_RXBUFF_EMPTY() (serialPort.Available() == 0)
위의 코드들을 적용한 _COMM_SETTING_H 헤더 파일 전체는 다음과 같습니다.#include <CppLinuxSerial/SerialPort.hpp> #ifndef _COMM_SETTING_H_ #define _COMM_SETTING_H_ using namespace mn::CppLinuxSerial; // Create serial port object and open serial port at 115200 buad, 8 data bits, no parity bit, one stop bit (8n1), // and no flow control SerialPort serialPort("/dev/ttyS0", BaudRate::B_115200, NumDataBits::EIGHT, Parity::NONE, NumStopBits::ONE); // Use SerialPort serialPort("/dev/ttyACM0", 13000); instead if you want to provide a custom baud rate serialPort.SetTimeout(-1); // Block when reading until any data is received serialPort.Open(); std::string readData; #define _SERIAL_TX_ENABLE() do{ }while(0) // Tx를 Enable하는 명령을 구현 #define _SERIAL_RX_ENABLE() do{ }while(0) // Rx를 Enable하는 명령을 구현 // send/recv #define _SERIAL_SEND_BYTE(c) do{serialPort.Write(c);}while(0) // 'char' 1byte를 send 하는 명령을 구현 #define _SERIAL_RECV_BYTE() (serialPort.Read(readData), (readData.empty() ? 0 : readData[0])) // check rx buffer #define _SERIAL_IS_RXBUFF_EMPTY() (serialPort.Available() == 0) #endif // _COMM_SETTING_H_
댓글 입력