从串行端口读取十六进制数据数组字节值

时间:2017-07-25 08:44:30

标签: c linux serial-port usbserial

我必须使用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 个答案:

答案 0 :(得分: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);