1

次のコードを実行している Arduino Uno があります。

byte data;

void setup(){
   Serial.begin(9600);
}

void loop(){

  data = 0xAA;
  Serial.write(data);
  delay(1000);
}

毎秒 0xAA の値をシリアル TX ピンに書き込むだけです。

シリアル TX ピンを DB9 ブレークアウト ケーブルのピン 3 に接続し、ブレークアウト ケーブルのピン 5 を Arduino のグランドに接続しました。シリアル ケーブルは、ラップトップの USB ポートに接続する USB-シリアル コンバーターに接続されます。過去の経験から、USB-シリアル コンバーターは信頼性が高く、データを歪めないことを知っています。

私のラップトップでは、以下のコードを実行しています。毎秒 AA が画面に表示されることを期待していますが、代わりに値 15 が表示されています。私のコードに何か問題がありますか、それとも電圧レベルの違いが原因ですか?

 void dump_packet(void* packet, int len)
 {
u_int8_t* bytes = (u_int8_t*)packet;
int i = 0;  

while (i < len){
    if (i == len-1){
        printf("%02X-", bytes[i++]);
    }
    else{
        printf("%d", bytes[i++]);
        }
}   
 }

 int ttySetRaw(int fd, struct termios *prevTermios)
 {
 struct termios t;
 if (tcgetattr(fd, &t) == -1)
  return -1;
 if (prevTermios != NULL)
 *prevTermios = t;
 t.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
 t.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR |
 INPCK | ISTRIP | IXON | PARMRK);
 t.c_oflag &= ~OPOST; /* Disable all output processing */
 t.c_cc[VMIN] = 1; /* Character-at-a-time input */
 t.c_cc[VTIME] = 0; /* with blocking */
 if (tcsetattr(fd, TCSAFLUSH, &t) == -1)
   return -1;
 return 0;
 }

 int main()
 {
   struct termios  tty;
   struct termios  savetty;
   speed_t     spd;
   unsigned int    sfd;
   unsigned char   buf[12];
   int reqlen = 79;
   int     rc;
   int     rdlen;
   int success;

   sfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
   rc = tcgetattr(sfd, &tty);
   if (rc < 0) {
    printf("failed to get attr: %d, %s", rc, strerror(errno));
    exit (-2);
   }
   savetty = tty;    /* preserve original settings for restoration */

   success = ttySetRaw(sfd, &tty);
   spd = B9600;
   cfsetospeed(&tty, (speed_t)spd);
   cfsetispeed(&tty, (speed_t)spd);

   if (sfd > 0 && success == 0){
printf("TTY set up ready to Read:\n\n");
   }

   memset(&buf[0], 0, sizeof(buf));

   do {
    rdlen = read(sfd, buf, reqlen);
  if (rdlen != -1){
    printf("Read %d bytes\n", rdlen);
    dump_packet( buf, rdlen);
   }

   } while (1);

   tcsetattr(sfd, TCSANOW, &savetty);
   close(sfd);
   exit (0);

   return 0;
   }
4

0 に答える 0