2021年1月23日土曜日

Linux UbuntuでArduinoのシリアルを受信するC言語

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側

こちらが受信側のCコード。read_serial.cというファイルに保存。
コンパイル、実行
$ 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;
}

出力

./serial 
12 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;amp; は & のこと


https://stackoverflow.com/questions/18019716/is-ampamp-valid


0 件のコメント:

コメントを投稿