2017-07-25 120 views
0

我必須使用C程序從串口讀取數據。我發送十六進制數組數據,設備將響應請求的相應響應。從串口讀取十六進制數據陣列字節值

我嘗試過使用GTK +串行端口端口,例如,如果我寫入數據「FC 05 40 2B 15」,設備將以「FC 05 50 AA 05」的形式恢復響應。

有人請指導我得到這個,我一直在努力這麼久。

我在這裏附上我的代碼。

void main() 
{ 
    int fd; 
    struct termios SerialPortSettings; 
    char write_buffer[512]; 
    int dispense_card[5] = { 0XFC,0X05,0x40,0x2B,0x15 }; 
    //char dispense[7] = {0x02,0x31,0x35,0x44,0x43,0x03,0x02};   
    int bytes_read = 0; 
    FILE* lfp; 
    time_t now; 
     time(&now); 

    //lfp = fopen("carddispense.log","a+"); 
    fd = open("/dev/ttyUSB1",O_RDWR | O_NOCTTY); 
    if(fd == -1) 
    { 
      //fprintf(lfp,"\nError! in Opening ttyUSB0 %s", ctime(&now)); 
     printf("\nError in Opening in ttyUSB0\n"); 
     exit(1); 
    } 
    else 
     { printf("\nttyUSB0 Opened Successfully\n"); 
     //fprintf(lfp,"Card reader has been used %s", ctime(&now)); 

     tcgetattr(fd, &SerialPortSettings);  /* save current serial port settings */ 
     cfsetispeed(&SerialPortSettings,B9600); /* Baud rate for read */ 
     cfsetospeed(&SerialPortSettings,B9600); 

     SerialPortSettings.c_cflag &= PARENB; // No Parity 
     SerialPortSettings.c_cflag &= ~CSTOPB; //Stop bits = 1 
     SerialPortSettings.c_cflag &= ~CSIZE; /* Clears the Mask  */ 
     SerialPortSettings.c_cflag |= CS8; /* Set the data bits = 8 */ 

     SerialPortSettings.c_cflag &= ~CRTSCTS; /*Turn off hardware based flow control */ 

     SerialPortSettings.c_cflag |= CREAD | CLOCAL; /* Turn on the receiver of the serial port (CREAD) */ 

     SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); /*Turn off hardware based flow control */ 

     SerialPortSettings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* NON Cannonical mode for serial communication */ 

     SerialPortSettings.c_cc[VMIN] = 100; /* Read 128 characters */ 
     SerialPortSettings.c_cc[VTIME] = 0; /* Wait indefinitely */ 

     tcsetattr(fd,TCSANOW,&SerialPortSettings); 
     int pos =0,percent_count = 0; 
     int i; 
     for(i=0;i<5;i++) 
     { 
      printf("number = %x\t",dispense_card[i]); 
      sprintf(write_buffer+(i),"%c", dispense_card[i]); 
     } 
     printf("write_buffer%s\n",write_buffer); 
     //printf("write_buffer length: %d\n",strlen(write_buffer)); 

     write(fd,write_buffer,strlen(write_buffer)); 
     close(fd); 
    } 
} 
+1

有沒有這樣的事情「十六進制數據」(可能除了一個字符串的形式)。十六進制是許多可能的數字文本表示之一。 '0xFC'是'252'是'0374'(和CCLII)。 – molbdnilo

+1

你忘了提到問題所在。 – molbdnilo

+0

我無法使用我的程序獲取「FC 05 50 AA 05」等確切數據。但是,我能得到GTK +串口終端工具 –

回答

0

試試這個

char tx_buf[5]; 
char rx_buf[5]; 

sprintf(tx_buf, "%c%c%c%c%c",0XFC,0X05,0x40,0x2B,0x15); 
write(fd, tx_buf, 5); 

while (1) { 
    int n = read (fd, rx_buf, 5); 
    if (n > 0) { 
     for(int i=0; i<n; i++) { 
      printf("data i: %02X ", rx_buf[i]); // "FC 05 50 AA 05" 
     } 
    } 
} 
close(fd); 
+0

:)謝謝你的一段代碼。代碼不會進入循環內部,因爲「n」值不會返回大於0. –

+0

嘗試在「while循環」中放入「讀取函數」以等待接收串行數據(n值大於0)。 – Ihdina

+0

看這裏以供參考https://en.wikibooks.org/wiki/Serial_Programming/termios – Ihdina

相關問題