3

Linuxを使用してPhidg​​etsbcのシリアルポートからバイナリデータを読み取り、PCで実行されているアプリケーションからコマンドを取得しています。データをバイト配列に読み取り、それを使用するために10進数に変換するテストプログラムをVBで作成しましたが、cでそれを行う方法を理解できません。私はインターネットで行った調査で何も思い付くことができません。

PCから送信されるコマンドは0x0Fです。

正しいデータを取得しているかどうかを確認するために、データを読み取って送り返します。これが私が返すものです。返されたデータには、キャリッジリターンが追加されています。

六角ディスプレイ0F0000000D

'\'ディスプレイ\0F\ 00 \ 00 \ 00 \ r

通常の表示では、奇妙な文字が表示されます。

これは、使用できるデータがそこにあることを示していますが、値0Fまたは15を抽出するために理解することはできません。

受信データを変換して使用するにはどうすればよいですか?

strtolを使用して受信データを変換しようとしましたが、0が返されます。ポートをrawに設定しようとしましたが、違いはありませんでした。

unsigned char buffer1[1];
int ReadPort1()
{
int result;

result = read(file1, &buffer1,1);

if(result > 0)
{
    WritePort1(buffer1);
    sprintf(tempstr, "Port1 data %s %d", buffer1, result);
    DisplayText(2,tempstr);
}
return result;
}

ポートのオープン/セットアップ

void OpenPort1()
{
//file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NONBLOCK);
     file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NODELAY);

if(file1 < 0)
    printf("Error opening serial port1.\n");
else
{
    SetPort(file1, 115200, 8, 1, 0, 1);
    port1open = 1;
}
}


void SetPort(int fd, int Baud_Rate, int Data_Bits, int Stop_Bits, int Parity, int raw)
{
    long BAUD;                      // derived baud rate from command line
    long DATABITS;
    long STOPBITS;
    long PARITYON;
    long PARITY;

struct termios newtio;

  switch (Baud_Rate)
  {
    case 115200:
        BAUD = B115200;
        break;
     case 38400:
        BAUD = B38400;
        break;
     case 19200:
        BAUD  = B19200;
        break;
     case 9600:
        BAUD  = B9600;
        break;
  }  //end of switch baud_rate
  switch (Data_Bits)
  {
     case 8:
     default:
        DATABITS = CS8;
        break;
     case 7:
        DATABITS = CS7;
        break;
     case 6:
        DATABITS = CS6;
        break;
     case 5:
        DATABITS = CS5;
        break;
  }  //end of switch data_bits
  switch (Stop_Bits)
  {
     case 1:
     default:
        STOPBITS = 0;
        break;
     case 2:
        STOPBITS = CSTOPB;
        break;
  }  //end of switch stop bits
  switch (Parity)
  {
     case 0:
     default:                       //none
        PARITYON = 0;
        PARITY = 0;
        break;
     case 1:                        //odd
        PARITYON = PARENB;
        PARITY = PARODD;
        break;
     case 2:                        //even
        PARITYON = PARENB;
        PARITY = 0;
        break;
  }  //end of switch parity

  newtio.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;   
  newtio.c_iflag = IGNPAR;

  if(raw == 1)
  {
        newtio.c_oflag &= ~OPOST;
        newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
  }
  else
  {
        newtio.c_lflag = 0;       //ICANON;
        newtio.c_oflag = 0;
  }

  newtio.c_cc[VMIN]=1;
  newtio.c_cc[VTIME]=0;
  tcflush(fd, TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);
}
4

1 に答える 1

-1

データの16進表現をお探しですか?

  sprintf(tempstr, "Port1 data %s %x", buffer1, buffer1[0]);
于 2012-09-18T15:18:57.203 に答える