我试图在Ardunio上的传感器之间创建数据交换(实际上是基于面包板的基于AtMega328PU的克隆,但我不相信这是我的问题的根源)和一个Processing脚本,我得到了一些意想不到的结果。我正在遵循详细的here串行通信方法,但我似乎不知道实际上没有数据通过串行连接传输。
Arduino代码:
int buttonPin = 9, photodiodePin = A0;
char dataToSend;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, OUTPUT);
pinMode(photodiodePin, INPUT);
}
void loop() {
if (Serial.available() > 0)
{
dataToSend = Serial.read();
if (dataToSend == 'B')
{
Serial.println(digitalRead(buttonPin));
}
else if (dataToSend == 'L')
{
Serial.println(analogRead(photodiodePin));
}
}
}
处理代码的相关部分:
import processing.serial.*;
Serial myPort;
void setup()
{
size(1600,900);
String portName = Serial.list()[1];
myPort = new Serial(this, portName, 9600);
}
void draw()
{
if(getButtonData() == 1)
{
//Do Stuff
}
}
int getLightData()
{
myPort.write('L');
println("L");
while(!(myPort.available() > 0)){
}
int lightValue = int(myPort.readStringUntil('\n'));
return lightValue;
}
int getButtonData()
{
myPort.write('B');
println("B");
while(!(myPort.available() > 0)){
println("stuck in here");
delay(500);
}
int buttonValue = int(myPort.readStringUntil('\n'));
return buttonValue;
}
在Processing中,我得到一个输出:
B
stuck in here
stuck in here
stuck in here
stuck in here
...
注意:我知道我从列表中选择了正确的端口,所以这不是问题。
我已尝试调试此问题并在互联网上搜索类似问题,但都无济于事。非常感谢您对此问题的任何帮助,谢谢!
答案 0 :(得分:0)
我首先检查是否只是从Arduino发送一条简单的消息到Processing工作。在Arduino中尝试这样的事情:
import processing.serial.*;
Serial arduino;
void setup(){
String portName = Serial.list()[1];
try{
arduino = new Serial(this, portName, 9600);
arduino.bufferUntil('\n');
}catch(Exception e){
System.err.println("Error initializing Serial port!\nPlease check connections and port settings");
e.printStackTrace();
}
}
void draw(){
}
void serialEvent(Serial s){
println("received arduino message: " + s.readString());
}
和处理中的这个:
serialEvent()
如果这个简单的设置有效,你可以继续进行下一步并进行双向通信。如果以上情况不起作用,那么还有一些其他问题导致串行通信出现问题(在这种情况下,请报告您正在接收的错误,如果有任何或您正在经历的行为)< / p>
如果上述情况有效,您可以尝试双向通信。请注意,我正在使用bufferUntil
和int buttonPin = 9, photodiodePin = A0;
char dataToSend;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, OUTPUT);
pinMode(photodiodePin, INPUT);
}
void loop() {
}
void serialEvent(){
if(Serial.available() > 0){
char cmd = Serial.read();
if(cmd == 'B'){
Serial.println(digitalRead(buttonPin));
}
if(cmd == 'L'){
Serial.println(analogRead(photodiodePin));
}
}
}
。尽可能避免阻塞while循环。
Arduino代码:
import processing.serial.*;
Serial arduino;
int digitalValue;
int analogValue;
int lastCMD;
void setup(){
size(200,100);
String portName = Serial.list()[1];
try{
arduino = new Serial(this, portName, 9600);
arduino.bufferUntil('\n');
}catch(Exception e){
System.err.println("Error initializing Serial port!\nPlease check connections and port settings");
e.printStackTrace();
}
}
void draw(){
background(0);
text("Press 'B' to read digital pin\nPress 'L' to read analog pin\n\n"+
"digital pin: " + digitalValue + "\nanalog pin: " + analogValue,10,25);
}
void keyReleased(){
if(key == 'B' || key == 'L'){
lastCMD = key;
println("sending command" + lastCMD);
if(arduino != null){
arduino.write(lastCMD);
}else println("Arduino is not initializing, not writing to serial port");
}
}
void serialEvent(Serial s){
String rawString = s.readString();
println("received arduino message" + rawString);
try{
rawString = rawString.trim();//remove any white space characters (if present)
if(lastCMD == 'B') digitalValue = int(rawString);
if(lastCMD == 'L') analogValue = int(rawString);
}catch(Exception e){
println("Error parsing String from serial port:");
e.printStackTrace();
}
}
处理代码:
{{1}}