无法从Arduino接收大量串行数据

无法从Arduino接收大量串行数据,arduino,serial-port,processing,Arduino,Serial Port,Processing,我试图从Arduino接收传感器数据,并使用处理IDE(使用串行通信/USB)将读数写入文件 在做了大量测试之后,我非常确定是处理方无法处理数据只有前几个(>8;//高字节 串行写入(buf,2); Serial.flush(); 延迟微秒(300); } 处理代码: import processing.serial.*; 串口; 字符串序列化数据; 打印机输出; int-recordingTime=1000;//要记录多少毫秒的数据流 字节[]数据缓冲=新字节[2];//为2字节保留内存并初

我试图从Arduino接收传感器数据,并使用处理IDE(使用串行通信/USB)将读数写入文件

在做了大量测试之后,我非常确定是处理方无法处理数据只有前几个(<100)“示例”被成功写入,之后
Serial.available()
始终返回false。

我从Arduino发送两个字节块,57600波特,默认设置(8位,无奇偶校验,1停止位)

Arduino代码:

无符号整数数据=0;
无符号字符buf[2];
无效设置(){
序列号。开始(57600);
}
void循环(){
数据=模拟读数(A0);
buf[0]=数据&0xFF;//低字节
buf[1]=数据>>8;//高字节
串行写入(buf,2);
Serial.flush();
延迟微秒(300);
}
处理代码:

import processing.serial.*;
串口;
字符串序列化数据;
打印机输出;
int-recordingTime=1000;//要记录多少毫秒的数据流
字节[]数据缓冲=新字节[2];//为2字节保留内存并初始化为0(java内容)
int receivedBytes=0;
无效设置()
{
serialPort=新的串行端口(此“/dev/ttyUSB0”,57600);
输出=createWriter(“serialData.txt”);
}
作废提款()
{
while(毫秒()0){
receivedBytes=serialPort.readBytes(数据缓冲区);
输出。打印(“\n”);
打印(“接收字节:”);
输出。打印(接收字节);
输出。打印(“\n”);
output.println(二进制(dataBuffer[0]);//低字节
output.println(二进制(dataBuffer[1]);//高位字节
output.println(“”);
}    
否则{
输出。打印(“\n”);
输出.println(“无可用数据”);
}
}
output.flush();
output.close();
退出();
}
输出:

Received bytes: 2
11101001
00000011


Received bytes: 2
11101001
00000011


Received bytes: 2
11101001
00000011

...after some lines...

No data available

No data available

No data available

No data available

No data available

No data available

为什么会发生这种情况?为什么在几个样本之后“没有可用的数据”?如果我在Arduino IDE中观看串行监视器输出,它工作正常。

我可以使用
屏幕和Python从Arduino读取串行数据。仍然无法使其在处理过程中发挥作用-只收到很少的样本(准确地说是17个)

Screen命令:
$Screen
(按ctrl+a,然后按shift+k停止程序;添加-L标志以记录到文件)。一切正常

我使用Python实现了相同的结果:

#
#   log_serial.py
#   Writes incoming serial data to file.

import time
import serial

# Edit this parameters =========================================================

serialPort = "/dev/ttyUSB0"
baudrate = 57600
recordTime = 1000   # milliseconds

# ==============================================================================


def millis():
    """
    Returns current (wall-)time in milliseconds
    """
    return int(round(time.time() * 1000))


ser = serial.Serial(serialPort, baudrate)

with open("output.txt", "w") as f:

    startTime = millis()

    f.write("Recording started at: ")
    f.write(str(startTime))
    f.write("\n")

    while (millis() - startTime) <= recordTime:
        inData = ser.read(2)                                        # reads two bytes
        inInt = int.from_bytes(inData, byteorder='little')          # merges them into an integer

        f.write(str(inInt))
        f.write("\n")

    f.write("Recording finished at: ")
    f.write(str(millis()))
    f.write("\n")

我使用
serialPort.read()
而不是
serialPort.readBytes(dataBuffer)
处理和我的Arduino Uno/Mega之间的串行通信没有问题。也许这会有所不同


您是否已尝试增加变量
recordingTime

请尝试运行此代码,然后发布写入文件的内容:

import processing.serial.*;

Serial serialPort;
String serialData;
PrintWriter output;

int recordingTime = 5000;          // how many miliseconds of data stream to record

void setup()
{
  serialPort = new Serial(this, "/dev/ttyUSB0", 57600);
  output = createWriter("serialData.txt");
}

void draw()
{

  int startTime = millis();
  while((millis() - startTime) <= recordingTime) {

    if (serialPort.available() > 0) {

      int b1 = serialPort.read();
      int b2 = serialPort.read();

      int value = (b2 << 8) + (b1 & 0xFF);
      output.print(millis());    //to each received value there is written the actual millis()-value
      output.print(",");
      output.println(value);
    }

  }

  output.flush();
  output.close();
  exit();  
}
import processing.serial.*;
串口;
字符串序列化数据;
打印机输出;
int-recordingTime=5000;//要记录多少毫秒的数据流
无效设置()
{
serialPort=新的串行端口(此“/dev/ttyUSB0”,57600);
输出=createWriter(“serialData.txt”);
}
作废提款()
{
int startTime=millis();
而((毫秒()-startTime)0){
int b1=serialPort.read();
int b2=serialPort.read();

int value=(b2我尝试使用read()函数、readBytes()、serialEvent(),所有这些函数……都是一样的,不会得到太多的样本。while条件中存在一个错误。应首先定义
int startTime
,然后该条件应如下所示:
while((milis()-startTime)但在处理代码中,您没有使用名为startTime的变量…确切地说,我在发布后注意到了这个错误,但这并不能解决我的问题…我编辑了以前的答案,添加了更新版本的处理代码尝试在处理循环中仅使用以下代码行:'output.println(serialPort.read())“。如果这行代码接收的数据量有限没有问题,则必须验证while和If条件。否则,串行通信存在一般性问题。另一个问题可能是您的输出,因此也可以尝试处理控制台而不是编写的文件…”。。。
import processing.serial.*;

Serial serialPort;
String serialData;
PrintWriter output;

int recordingTime = 5000;          // how many miliseconds of data stream to record

void setup()
{
  serialPort = new Serial(this, "/dev/ttyUSB0", 57600);
  output = createWriter("serialData.txt");
}

void draw()
{

  int startTime = millis();
  while((millis() - startTime) <= recordingTime) {

    if (serialPort.available() > 0) {

      int b1 = serialPort.read();
      int b2 = serialPort.read();

      int value = (b2 << 8) + (b1 & 0xFF);
      output.print(millis());    //to each received value there is written the actual millis()-value
      output.print(",");
      output.println(value);
    }

  }

  output.flush();
  output.close();
  exit();  
}