1

MacでCを使用してarduinoと「会話」したい。私は最初にarduinoの公式ウェブサイトにあるリンクのコードを使用しました:http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/

「点滅」の例を使用すると、それは単に機能しません。シリアルポートが開いているときに新しいarduinoがリセットされることはわかっていますが、遅延(最大4秒)を追加しても、送信する文字が1回だけ点滅します。

また、termiosフラグでHUPCLを無効にして(リセットを防ぐ必要があります)コードを変更しようとしましたが、何も変更されません。

面白いのは、Arduino公式アプリのシリアルモニターをバックグラウンドでロードすると機能することです。コマンド画面も完全に機能します。ですから、シリアル通信の初期化と関係があると思います。次に、 stty -aを使用してモニターで使用されるフラグ(l、i、o、およびc)を取得し、Cプログラムで使用しようとしました...運が悪かったです!

助けてくれてありがとう!

PS:これはeBayで購入した中国のクローンです...多分それは関連している可能性があります

編集:私はPythonを使用してpyserialで同じことをしようとしましたが、同じことをします:arduinoアプリのシリアルモニターが同時に実行されている場合にのみ機能します

4

3 に答える 3

3

なるほど、見つかったと思います。

arduino Uno を試すことができましたが、結果は同じでした。その後、なんらかの理由で、最初の接続時だけでなく、シリアルポートを介した通信ごとにarduinoがリセットされていることに気付きました。結果はWindowsでも同じなので、私のラップトップ(MBP 15インチ、2011年初頭、10.7.4)に関係があると思います。

次に、少し検索したところ、C または Python を使用して DTR (ボードをリセットする信号) を無効にする方法が実際にあることがわかりました。

import serial, time

#open the serial port
s = serial.Serial(port='/dev/tty.usbserial-A5006HGR', baudrate=9600)

#disable DTR
s.setDTR(level=False)

#wait for 2 seconds
time.sleep(2)

#send the data
s.write("7")

C では、シリアル ポートからパラメーターをロードし、DTR を無効にしてからパラメーターを更新する必要があります。これはioctl( http://www.easysw.com/~mike/serial/serial.html#5_1_2から)

//load status
int status;
ioctl(fd, TIOCMGET, &status);

//disable DTR
status &= ~TIOCM_DTR;

//update the status
ioctl(fd, TIOCMSET, &status);

これは、ポートが開かれた後にコードに配置できます。ただし、ボードは最初の接続で再起動するので、最初の遅延が必要です。

これが同じ(異常な)状況にある人々に役立つことを願っています。

于 2012-07-09T13:28:36.813 に答える
3

最後に、Linux の Python (私の場合は 2.7.3) の場合、次のようにする必要があることがわかりました。

ser = serial.Serial('/dev/ttyACM0', 9600)
ser.dsrdtr=False
ser.setDTR(level=False)

リセットはありません

于 2012-12-17T19:58:44.983 に答える
0

その方法が Mac のシリアル ポートを開くのに信頼できるとは思えませんでした。ioctl を使用することをお勧めします。これは、はるかに堅牢であり、主に任意のボーレートを使用できるという多くの利点があります。

#import <IOKit/serial/ioss.h>
#import <sys/ioctl.h>

- (int)serialInit:(const char*)path baud:(int)baud;
{
    struct termios options;

    // open the serial like POSIX C
    int serialFileDescriptor = open(path, O_RDWR | O_NOCTTY | O_NONBLOCK);

    // block non-root users from using this port
    ioctl(serialFileDescriptor, TIOCEXCL);

    // clear the O_NONBLOCK flag, so that read() will
    //   block and wait for data.
    fcntl(serialFileDescriptor, F_SETFL, 0);

    // grab the options for the serial port
    tcgetattr(serialFileDescriptor, &options);

    // setting raw-mode allows the use of tcsetattr() and ioctl()
    cfmakeraw(&options);

    // specify any arbitrary baud rate
    ioctl(serialFileDescriptor, IOSSIOSPEED, &baud);

    return serialFileDescriptor;
}
于 2012-07-08T23:58:44.723 に答える