2014-03-27 3 views
2

RS232 시리얼 포트를 통해 연결된 바코드 스캐너가 있습니다. 이 장치를 PC에 연결하고 데이터를 전송하는 프로그램을 작성해야합니다. 이미 통신 링크를 초기화하는 몇 가지 기본 방법을 작성하고 장치에 BEEP 명령을 보내 테스트를 시도했지만 예상대로 비프 음이 발생하지 않습니다. 그래서 내 소스 코드에 문제가 있다고 생각한다. 제발 누군가가 나를 소스 코드를 완성 도와주세요. 다음 서명 숯불 sendBeep[] = {0x05, 0xE6, 0x04, 0x00, 0x0D, 0x00, 0x00};RS232 시리얼 포트를 통해 바코드 스캐너로 데이터 보내기

#include <iostream> 
extern "C" 
{ 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <unistd.h> 
} 
#include "DeviceRS232.h" 

using namespace std; 

int main() 
{ 

    //char sendBuffer[4096] = "      "; 
    unsigned char sendBeep[] = {0x05, 0xE6, 0x04, 0x00, 0x0D, 0x00, 0x00}; 
    unsigned char ledOn[] = {0x05, 0xE7, 0x04, 0x00, 0x0D, 0x00}; 
    unsigned char val[7]; 

    cout << "********************** RS232 - SSI **********************" << endl << endl; 
    DeviceRS232 dev_rs232; 
    dev_rs232.setDefaultAttributes(); 
    dev_rs232.openSerialPort(); 

    //---------------------------------------------------- 
    //for(int x=0; x<10; x++) 
    //{ 
    // dev_rs232.sendDataBuffer(sendBeep, sizeof(sendBeep)); 
    //} 
    //---------------------------------------------------- 

    int sizeSent = dev_rs232.sendDataBuffer(sendBeep, sizeof(sendBeep)); 
    if(sizeSent > 0) 
    { 
     printf("Data sent: %d...\n", sizeSent); 
    } 

    sleep(10); 

    dev_rs232.closeSerialPort(); 
    cout << "*********************************************************" << endl; 


    return 0; 
} 

쓰여진 소스 코드

01)에게 DeviceRS232.h

#ifndef DEVICERS232_H 
#define DEVICERS232_H 

extern "C" 
{ 
#include <stdio.h> 
#include <string.h> 
#include <termios.h> 
#include <sys/ioctl.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <limits.h> 
} 

#include <string> 

#define MAX_SERIAL_PORT_NO 30 



class DeviceRS232 
{ 
    public: 
     DeviceRS232(); 
     virtual ~DeviceRS232(); 

     int fdRS232;     // file descriptor for the serial port 

     void setSerialPort(std::string sp); 
     void setBaudRate(long baud); 
     void setDataBits(int dataBit); 
     void setStopBits(int stopBit); 
     void setNumberOfParityBits(int nparityBits); 
     void setDefaultAttributes(); 
     long getBaudRate(); 
     std::string getSerialPort(); 
     int openSerialPort(); 
     int readUserConfiguration(); 
     int sendDataBuffer(const unsigned char *dataBuffer, size_t bufferSize); 
     void closeSerialPort(); 


    protected: 
     std::string serialPort;   // Serial port like /dev/ttyS0 
     long baudRate;     // Scanner baud rate 
     int dataBits;     // data bits 
     int stopBits;     // stop bits 
     int numberOfParityBits;   // number of parity bits 
     termios oldSerialPortSetting; // Current values of termios structure for /dev/ttyS0 
     termios newSerialPortSetting; // new termios attributes for /dev/ttyS0 


    private: 
}; 

#endif // DEVICERS232_H 

2) DeviceRS232.cpp

#include "DeviceRS232.h" 

DeviceRS232::DeviceRS232() 
{ 
    //ctor 
} 

DeviceRS232::~DeviceRS232() 
{ 
    //dtor 
} 

void DeviceRS232::setSerialPort(std::string sp) 
{ 
    serialPort = sp; 
} 

void DeviceRS232::setBaudRate(long baud) 
{ 
    baudRate = baud; 
} 

void DeviceRS232::setDataBits(int dataBit) 
{ 
    dataBits = dataBit; 
} 

void DeviceRS232::setStopBits(int stopBit) 
{ 
    stopBits = stopBit; 
} 

void DeviceRS232::setNumberOfParityBits(int nparityBits) 
{ 
    numberOfParityBits = nparityBits; 
} 

void DeviceRS232::setDefaultAttributes() 
{ 
    std::string sp = "/dev/ttyS0"; 
    long baud = 9600; 
    int dataBit = 1; 
    int stopBit = 1; 
    int nparityBits = 0; 

    setSerialPort(sp); 
    setBaudRate(baud); 
    setDataBits(dataBit); 
    setStopBits(stopBit); 
    setNumberOfParityBits(nparityBits); 
} 

long DeviceRS232::getBaudRate() 
{ 
    return baudRate; 
} 

std::string DeviceRS232::getSerialPort() 
{ 
    return serialPort; 
} 

int DeviceRS232::openSerialPort() 
{ 
    int fd, baudr, status, portStatus; 
    setDefaultAttributes(); 

    switch(getBaudRate()) 
    { 
     case  50 : baudr = B50; 
         break; 
     case  75 : baudr = B75; 
         break; 
     case  110 : baudr = B110; 
         break; 
     case  134 : baudr = B134; 
         break; 
     case  150 : baudr = B150; 
         break; 
     case  200 : baudr = B200; 
         break; 
     case  300 : baudr = B300; 
         break; 
     case  600 : baudr = B600; 
         break; 
     case 1200 : baudr = B1200; 
         break; 
     case 1800 : baudr = B1800; 
         break; 
     case 2400 : baudr = B2400; 
         break; 
     case 4800 : baudr = B4800; 
         break; 
     case 9600 : baudr = B9600; 
         break; 
     case 19200 : baudr = B19200; 
         break; 
     case 38400 : baudr = B38400; 
         break; 
     case 57600 : baudr = B57600; 
         break; 
     case 115200 : baudr = B115200; 
         break; 
     case 230400 : baudr = B230400; 
         break; 
     case 460800 : baudr = B460800; 
         break; 
     case 500000 : baudr = B500000; 
         break; 
     case 576000 : baudr = B576000; 
         break; 
     case 921600 : baudr = B921600; 
         break; 
     case 1000000 : baudr = B1000000; 
         break; 
     default  : printf("invalid baudrate\n"); 
         return(1); 
         break; 
    } 

    // Open serial port 
    fd = open(getSerialPort().c_str(), O_RDWR | O_NOCTTY | O_NDELAY); 
    if(fd == -1) 
    { 
     printf("Unable to open serial port...\n"); 
     return 1; 
    } 

    fdRS232 = fd; 
    status = tcgetattr(fdRS232, &oldSerialPortSetting); 
    if(status == -1) 
    { 
     close(fdRS232); 
     printf("Unable to get serial port attributes...\n"); 
     return 1; 
    } 

    memset(&newSerialPortSetting, 0, sizeof(newSerialPortSetting)); 
    newSerialPortSetting.c_cflag = baudr | CS8 | CLOCAL | CREAD; // 
    newSerialPortSetting.c_iflag = IGNPAR; 
    newSerialPortSetting.c_oflag = 0; 
    newSerialPortSetting.c_lflag = 0; 
    newSerialPortSetting.c_cc[VMIN] = 0; 
    newSerialPortSetting.c_cc[VTIME] = 0; 

    status = tcsetattr(fdRS232, TCSANOW, &newSerialPortSetting); 
    if(status==-1) 
    { 
     close(fdRS232); 
     perror("unable to adjust portsettings "); 
     return 1; 
    } 

    // Get the status of opened serial port 
    if(ioctl(fdRS232, TIOCMGET, &portStatus) == -1) 
    { 
     perror("Unable to get port status"); 
     return 1; 
    } 

    // Tern on DTR and RTS 
    portStatus |= TIOCM_DTR; 
    portStatus |= TIOCM_RTS; 

    // Set the status of the port with new DTR, RTS values 
    if(ioctl(fdRS232, TIOCMSET, &portStatus) == -1) 
    { 
     perror("Unable to set port status..."); 
     return 1; 
    } 

    return 0; 
} 

int DeviceRS232::sendDataBuffer(const unsigned char *dataBuffer, size_t bufferSize) 
{ 
    return write(fdRS232, dataBuffer, bufferSize); 
} 

void DeviceRS232::closeSerialPort() 
{ 
    int portStatus; 

    if(ioctl(fdRS232, TIOCMGET, &portStatus) == -1) 
    { 
     perror("Unable to get the port status"); 
    } 

    // Tern off DTR and RTS 
    portStatus &= ~TIOCM_DTR; 
    portStatus &= ~TIOCM_RTS; 

    // Set the status of the port with new DTR, RTS values 
    if(ioctl(fdRS232, TIOCMSET, &portStatus) == -1) 
    { 
     perror("Unable to set port status..."); 
    } 

    close(fdRS232); 
} 

3)이다 MAIN.CPP 바 장치의 직렬 포트 통신 프로토콜 사양을 고려하여 작성되었습니다.

이 (출력을 추가 편집) 아웃 넣어 :

********************** RS232 - SSI ********************** 

Data sent: 7... 
********************************************************* 

Process returned 0 (0x0) execution time : 10.006 s 
Press ENTER to continue. 

모든 도움과 제안을 환영합니다. 감사.

+0

컴퓨터의 직렬 포트를 다른 컴퓨터 [또는 두 번째 직렬 포트가있는 동일한 컴퓨터]에 연결하고 데이터를 보내고 있는지 확인 했습니까? 배선에서 DTR/RTS를 사용합니까? –

+0

@Mats Petersson : 실제로는 아니요, 자원 부족으로 2 대의 피어 투 피어 컴퓨터를 사용하여 수행 할 수 없었습니다. 제발 시뮬레이터를 셋업하기위한 힌트를 줄 수 있다면 제발요. –

+0

컴퓨터에 USB 포트가 있습니까? 그렇다면 아마도 USB에 연결된 직렬 포트를 얻을 수 있으며, 우선 minicom을 사용하여 직렬 포트를 "수신"합니다. 물론 메시지가있는 것처럼 "보이지 않는"16 진수 대신 읽을 수있는 텍스트를 보내도록 코드를 변경하고 싶을 수도 있습니다. –

답변

1
#include <iostream> 
extern "C" 
{ 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <unistd.h> 
} 
#include "DeviceRS232.h" 

using namespace std; 

int main() 
{ 

    unsigned char sendBuffer[4096] = "Test test test..."; 
    unsigned char sendBeep[] = {0x05, 0xE6, 0x04, 0x00, 0x11, 0x46, 0x00}; 
    unsigned char ledOn[] = {0x05, 0xE7, 0x04, 0x00, 0x0D, 0x00}; 
    unsigned char val[7]; 

    //------------------------------------------------------------------------- 
    unsigned char commonBuffer[257]; 

    int iChecksum; 
    int i; 
    commonBuffer[ 1 ] = (unsigned char)0xC6; 
    commonBuffer[ 2 ] = (unsigned char)0x04; 
    commonBuffer[ 3 ] = (unsigned char)0x08; // Permanant Chnage 
    commonBuffer[ 4 ] = (unsigned char)0x11; // Beep after setting. FF for No Beep 
    commonBuffer[ 5 ] = (unsigned char)0xEE; // Decorder parameter to set (238) 
    commonBuffer[ 6 ] = (unsigned char)0x01; // Value to set 

    commonBuffer[ 0 ] = (unsigned char)0x07; // Length 

    iChecksum = 0; 
    for (i = 0; i < 7; i++) 
    { 
     iChecksum += commonBuffer[i]; 
    } 

    commonBuffer[i++] = (char)(((-iChecksum) >> 8) & 0xFF); // Add Checksum into the command 
    commonBuffer[i++] = (char)((-iChecksum) & 0xFF); 
    //------------------------------------------------------------------------- 


    cout << "********************** RS232 - SSI **********************" << endl << endl; 
    DeviceRS232 dev_rs232; 
    dev_rs232.setDefaultAttributes(); 
    dev_rs232.openSerialPort(); 

    //---------------------------------------------------- 
    //for(int x=0; x<10; x++) 
    //{ 
    // dev_rs232.sendDataBuffer(sendBeep, sizeof(sendBeep)); 
    //} 
    //---------------------------------------------------- 

    int sizeSent = dev_rs232.sendDataBuffer(commonBuffer, sizeof(commonBuffer)); 
    if(sizeSent > 0) 
    { 
     printf("Data sent: %d...\n", sizeSent); 
    } 

    sleep(1); 

    dev_rs232.closeSerialPort(); 
    cout << "*********************************************************" << endl; 


    return 0; 
} 
관련 문제