한달 째 고민중인 cpp "char" 1byte send/receive 코드 질문 드립니다..ㅠㅠ

조회수 266회

안녕하세요. 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_
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)