我无法通过 USB 串行连接向我的 Arduino 发送数据
I cannot send data to my Arduino through usb serial connection
所以,我有一个 arduino uno R3 SMD 版本,我想在它 运行ning 时向它发送命令。它有一个连接到它的 adafruit v2 电机屏蔽,它与 arduino 分开供电。 arduino 通过 USB 电缆连接到我的笔记本电脑。
现在,电机护罩可以工作了,我可以将代码发送到 arduino 让它做事。虽然我无法让 arduino 接收我发送给它的任何东西,但它是 运行ning 从串行连接。不过,我可以从 arduino 代码打印到 arduino ide 中的显示器。我正在使用 debian linux stretch 顺便说一句。我的 arduino ide 来自 debian 仓库。
这是我要使用的所有代码:
Arduino 代码
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);
void setup()
{
Serial.begin(115200);
AFMS.begin();
myMotor->setSpeed(300);
}
char input;
int dir;
void loop()
{
dir = 0;
if (Serial.available() > 0) {
input = Serial.read();
Serial.print(input);
if (input == 1) {
dir = FORWARD;
}
if (input == 2) {
dir = BACKWARD;
}
}
if (dir != 0) {
myMotor->step(360, dir, DOUBLE);
delay(1000);
}
}
笔记本电脑上的控制器代码
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
FILE *arduino;
int c;
arduino = fopen("/dev/ttyACM0", "w");
if (arduino == NULL) {
fprintf(stdout, "NOOOOOOOOOOOO\n");
}
while (1) {
c = fgetc(stdin);
if (c == 'f') {
fprintf(arduino, "%d", 1);
}
if (c == 'b') {
fprintf(arduino, "%d", 2);
}
fflush(arduino);
if (c == 'q') {
break;
}
}
return 0;
}
我很确定这不是权限问题,我已经 运行 来自 root 的控制器代码并且 tty 设备可以正常打开。此外,我已经尝试了 9600 和 115200 的波特率,但没有骰子。有人有 idea 吗?通过谷歌搜索,似乎其他人都在这样做。
您的控制器正在发送 个字符 '1'
和 '2'
。您的 Arduino 正在检查 字符代码 1
和 2
- 换句话说,字符 CtrlA 和 CtrlB。您可以在任一端进行更改,它们只需要匹配即可。
所以,我有一个 arduino uno R3 SMD 版本,我想在它 运行ning 时向它发送命令。它有一个连接到它的 adafruit v2 电机屏蔽,它与 arduino 分开供电。 arduino 通过 USB 电缆连接到我的笔记本电脑。
现在,电机护罩可以工作了,我可以将代码发送到 arduino 让它做事。虽然我无法让 arduino 接收我发送给它的任何东西,但它是 运行ning 从串行连接。不过,我可以从 arduino 代码打印到 arduino ide 中的显示器。我正在使用 debian linux stretch 顺便说一句。我的 arduino ide 来自 debian 仓库。
这是我要使用的所有代码:
Arduino 代码
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);
void setup()
{
Serial.begin(115200);
AFMS.begin();
myMotor->setSpeed(300);
}
char input;
int dir;
void loop()
{
dir = 0;
if (Serial.available() > 0) {
input = Serial.read();
Serial.print(input);
if (input == 1) {
dir = FORWARD;
}
if (input == 2) {
dir = BACKWARD;
}
}
if (dir != 0) {
myMotor->step(360, dir, DOUBLE);
delay(1000);
}
}
笔记本电脑上的控制器代码
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
FILE *arduino;
int c;
arduino = fopen("/dev/ttyACM0", "w");
if (arduino == NULL) {
fprintf(stdout, "NOOOOOOOOOOOO\n");
}
while (1) {
c = fgetc(stdin);
if (c == 'f') {
fprintf(arduino, "%d", 1);
}
if (c == 'b') {
fprintf(arduino, "%d", 2);
}
fflush(arduino);
if (c == 'q') {
break;
}
}
return 0;
}
我很确定这不是权限问题,我已经 运行 来自 root 的控制器代码并且 tty 设备可以正常打开。此外,我已经尝试了 9600 和 115200 的波特率,但没有骰子。有人有 idea 吗?通过谷歌搜索,似乎其他人都在这样做。
您的控制器正在发送 个字符 '1'
和 '2'
。您的 Arduino 正在检查 字符代码 1
和 2
- 换句话说,字符 CtrlA 和 CtrlB。您可以在任一端进行更改,它们只需要匹配即可。