Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Arduino UNO中读取不带IDE的USB数据_C_Arduino_Usbserial - Fatal编程技术网

C 在Arduino UNO中读取不带IDE的USB数据

C 在Arduino UNO中读取不带IDE的USB数据,c,arduino,usbserial,C,Arduino,Usbserial,我有一个Arduino UNO。我写了一个脚本来控制连接到Arduino上引脚2、3、4的灯光。使用我的笔记本电脑可以关闭或打开灯: 0关闭所有指示灯 1打开针脚1上的LED 2打开针脚2上的LED 3打开针脚1和针脚2上的LED 4打开针脚3上的LED 5打开针脚1和3上的LED 6打开针脚2和3上的LED 7打开所有指示灯 实际上,我只对从笔记本电脑发送数据并相应地闪烁灯感兴趣 以下是我的节目: #pragma GCC优化(“Ofast”) #定义LED1 2 #定义LED2 3 #定义

我有一个Arduino UNO。我写了一个脚本来控制连接到Arduino上引脚2、3、4的灯光。使用我的笔记本电脑可以关闭或打开灯:

  • 0关闭所有指示灯
  • 1打开针脚1上的LED
  • 2打开针脚2上的LED
  • 3打开针脚1和针脚2上的LED
  • 4打开针脚3上的LED
  • 5打开针脚1和3上的LED
  • 6打开针脚2和3上的LED
  • 7打开所有指示灯
实际上,我只对从笔记本电脑发送数据并相应地闪烁灯感兴趣

以下是我的节目:

#pragma GCC优化(“Ofast”)
#定义LED1 2
#定义LED2 3
#定义LED3 4
char-buf[4];
无符号字符inp,len;
无效设置(){
引脚模式(LED1,输出);
引脚模式(LED2,输出);
引脚模式(LED3,输出);
序列号开始(115200);
串行设置超时(1);
}
void循环(){
如果(Serial.available()>0){
len=串行.readBytes(buf,3);
如果(len){
buf[3]='\0';
inp=atoi(buf);
//发光二极管
数字写入(LED1、1和inp?高:低);
数字写入(LED2、2和inp?高:低);
数字写入(LED3、4和inp?高:低);
}
}
}
当我打开IDE的串行监视器并编写
printf1>/dev/ttyUSB0
时,它工作正常

但是当我关闭串行监视器,并且
printf 1>/dev/ttyUSB0
时,它不工作,我得到的唯一东西就是闪烁的板载LED

所以每次我需要点亮LED时,我必须确保IDE是打开的


有没有办法在不打开IDE的情况下从任何Linux计算机写入Arduino串行端口?

好的,问题是Arduino有serial.read()代码。除非我打开Arduino IDE的串行监视器,否则我发送的数据将失败。换句话说,如果我想创建一个可热插拔的设备,我的笔记本电脑会在一个循环中搜索该设备,并在插入时向其写入数据,这是不可能的

现在要解决这个问题,我需要看看IDE的串行监视器做什么,它设置波特率,并在所选端口上打开文件描述符3

为了解决热插拔问题,我首先需要设置波特率和匹配标志。然后我需要用fcntl文件描述符3打开文件,就像IDE的串行监视器一样

因为我是用Ruby编写发送字节的,所以我有机会编写C Ruby。我用以下代码设置波特率:

VALUE setBaudRate(volatile VALUE obj, volatile VALUE dev, volatile VALUE speed) {
    char *device = StringValuePtr(dev) ;
    unsigned int spd = NUM2UINT(speed) ;

    int serial_port = open(device, O_RDWR) ;
    struct termios tty ;

    char status = tcgetattr(serial_port, &tty) ;

    // IDE sets these flags
    // speed 57600 baud; line = 0;
    // min = 0; time = 0;
    // -brkint -icrnl -imaxbel
    // -opost
    // -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

    if(status != 0) return Qnil ;
    tty.c_cflag &= ~CSIZE ;
    tty.c_cflag |= CS8 ;
    tty.c_cflag |= CREAD | CLOCAL ;
    tty.c_oflag &= ~OPOST ;

    tty.c_lflag &= ~ECHO ;
    tty.c_lflag &= ~ECHOCTL ;
    tty.c_lflag &= ~ECHOK ;
    tty.c_lflag &= ~ECHOE ;
    tty.c_lflag &= ~ECHOKE ;
    tty.c_lflag &= ~ISIG ;
    tty.c_lflag &= ~ICRNL ;
    tty.c_lflag &= ~IEXTEN ;
    tty.c_lflag &= ~ICANON ;

    tty.c_cc[VTIME] = 0 ;
    tty.c_cc[VMIN] = 0 ;

    cfsetispeed(&tty, spd) ;
    cfsetospeed(&tty, spd) ;
    status = tcsetattr(serial_port, TCSANOW, &tty) ;

    if (status == 0) return Qtrue ;
    else return Qfalse ;
}
如果您正在编写C,只需将值函数名替换为您想要的任何名称。失败时返回你喜欢的任何值,成功可以是0,失败可以是1和2

现在,确保波特率与arduino完全匹配。在我的Ruby C扩展中,我实际上是从Ruby
volatile VALUE speed
获得波特率。然后设置速度。一个纯C的实现不会有太大的不同

但是,在BASH中,您可以只使用
stty

sudo stty -F /dev/ttyUSB0 -cread -clocal -isig -iexten -echo -echoe -echok -echoctl -echoe -brkint -icrnl -imaxbel -opost -icanon min 0 time 0 57600

无论如何,要写入文件,您需要以读写模式打开文件。Ruby提供,我将附加代码,以防它帮助某人:

需要“fcntl”
设备='/dev/ttyUSB0'
fd=IO.sysopen(设备,Fcntl::O|RDWR | Fcntl::O|U EXCL)
文件=IO.open(fd)
syswrite文件(“Hello world!”)
file.close
在BASH中,您只需使用以下命令:

exec 3/dev/ttyUSB0
现在,如果不想硬编码/dev/ttyUSB0,则需要从arduino发送一些字节,并在设置与arduino匹配的正确波特率后读取这些字节


通过这种方式,我们可以读取和写入arduino的值

Uno在新USB连接上重置。如果要发送1,为什么要使用串行监视器发送
printf 1>/dev/ttyUSB0
?您的代码正在等待3个字节
printf 1
发送一个字节。但是,由于1毫秒超时,您收到1字节。很难说
buf[1]
buf[2]
在这一点上包含了什么。如果您只需要3位,那么应该只发送和接收一个字节。您是否尝试过
echo 1>/dev/ttyUSB0
?它添加了一个类似串行监视器的换行符。-你检查过Uno上重置信号的电平了吗?嗨,是的,如果我回音,它也不工作。在echo之前,我必须这样做:
exec 3/dev/ttyUSB0