次のコードを実行している 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;
}