无法从Arduino接收大量串行数据
我试图从Arduino接收传感器数据,并使用处理IDE(使用串行通信/USB)将读数写入文件 在做了大量测试之后,我非常确定是处理方无法处理数据只有前几个(<100)“示例”被成功写入,之后无法从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字节保留内存并初
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();
}