Arduinoでシリアル出力して、Linuxで受信して表示します。
こちらのブログのコードを少しだけ変えました。元ブログはPart1から4まであります。
https://chrisheydrick.com/2012/06/12/how-to-read-serial-data-from-an-arduino-in-linux-with-c-part-1/
Arduino側
シンプルなHelloWorldです。書き込んでシリアル出力を確認。
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print("Hello World\n");
delay(1000);
}
Linux側
コンパイル、実行
$ gcc -Wall -o serial read_serial.c$ ./serial
#include <stdio.h>
#include <stdlib.h>
#include <x86_64-linux-gnu/sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
/* My Arduino is on /dev/ttyACM0 */
char *portname = "/dev/ttyACM0";
char buf[256];
int main(int argc, char *argv[])
{
int fd;
/* Open the file descriptor in non-blocking mode */
fd = open(portname, O_RDWR | O_NOCTTY);
/* Set up the control structure */
struct termios toptions;
/* Get currently set options for the tty */
tcgetattr(fd, &toptions);
/* Set custom options */
/* 9600 baud */
cfsetispeed(&toptions, B9600);
cfsetospeed(&toptions, B9600);
/* 8 bits, no parity, no stop bits */
toptions.c_cflag &= ~PARENB;
toptions.c_cflag &= ~CSTOPB;
toptions.c_cflag &= ~CSIZE;
toptions.c_cflag |= CS8;
/* no hardware flow control */
toptions.c_cflag &= ~CRTSCTS;
/* enable receiver, ignore status lines */
toptions.c_cflag |= CREAD | CLOCAL;
/* disable input/output flow control, disable restart chars */
toptions.c_iflag &= ~(IXON | IXOFF | IXANY);
/* disable canonical input, disable echo,
disable visually erase chars,
disable terminal-generated signals */
toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/* disable output processing */
toptions.c_oflag &= ~OPOST;
/* wait for 12 characters to come in before read returns */
/* WARNING! THIS CAUSES THE read() TO BLOCK UNTIL ALL */
/* CHARACTERS HAVE COME IN! */
toptions.c_cc[VMIN] = 12;
/* no minimum time to wait before read returns */
toptions.c_cc[VTIME] = 0;
/* commit the options */
tcsetattr(fd, TCSANOW, &toptions);
/* Wait for the Arduino to reset */
usleep(1000*1000);
/* Flush anything already in the serial buffer */
tcflush(fd, TCIFLUSH);
/* read up to 128 bytes from the fd */
int n = read(fd, buf, 128);
/* print how many bytes read */
printf("%i bytes got read...\n", n);
/* print what's in the buffer */
printf("Buffer contains...\n%s\n", buf);
return 0;
}
出力
./serial12 bytes got read...Buffer contains...Hello World
変更した点:
ioctl.h が No Such File Or Directory のエラー となる
ヘッダの置き場所が違うらしいので変更。
locate ioctl.h | grep /usr/include/
とやると、それらしきものが出てくる。その中からubuntuだとx86...を選ぶ。
#include <ioctl.h>
を
#include <x86_64-linux-gnu/sys/ioctl.h>
に変更したら直った。
https://askubuntu.com/questions/414110/wheres-my-usr-include-sys-directory
&amp; は & のこと
https://stackoverflow.com/questions/18019716/is-ampamp-valid
0 件のコメント:
コメントを投稿