ArduinoPI Python-串行连接丢失数据
意图:从串行端口控制arduino uno 工具: 我让服务器在我的mac和我的b+Raspberry型号上工作。 在这两种情况下,浏览器的行为如下图所示 在我看来,服务器似乎成功地将消息发送给了Arduino。但数据在途中不知何故丢失了。每次我访问浏览器中的url时,Arduino板都会重置。我在谷歌上搜索发现,在接地和复位引脚之间有一个10uF电容器可以防止复位发生。是的,但针脚3不会变高。我得到了一个LED+电阻插在引脚3和地面相应。每次访问url时,我都可以看到Rx led闪烁。所以我觉得Arduino误解了我烧瓶服务器的命令 OG Arduino代码:ArduinoPI Python-串行连接丢失数据,python,arduino,raspberry-pi,Python,Arduino,Raspberry Pi,意图:从串行端口控制arduino uno 工具: 我让服务器在我的mac和我的b+Raspberry型号上工作。 在这两种情况下,浏览器的行为如下图所示 在我看来,服务器似乎成功地将消息发送给了Arduino。但数据在途中不知何故丢失了。每次我访问浏览器中的url时,Arduino板都会重置。我在谷歌上搜索发现,在接地和复位引脚之间有一个10uF电容器可以防止复位发生。是的,但针脚3不会变高。我得到了一个LED+电阻插在引脚3和地面相应。每次访问url时,我都可以看到Rx led闪烁。所以我觉
String cmd;
bool cmdRec = false;
void setup()
{
//Start the connection with the Raspberry Pi
Serial1.begin(115200);
// Start the connection with the Laptop, for debugging only!
//Serial.begin(115200);
}
void loop()
{
handleCmd();
}
void serialEvent1() {
while(Serial1.available() > 0) {
char inByte = (char)Serial1.read();
if(inByte == ':') {
cmdRec = true;
return;
} else if(inByte == '@') {
cmd = "";
cmdRec = false;
return;
} else {
cmd += inByte;
return;
}
}
}
void handleCmd() {
if(!cmdRec) return;
// If you have problems try changing this value,
// my MEGA2560 has a lot of space
int data[80];
int numArgs = 0;
int beginIdx = 0;
int idx = cmd.indexOf(",");
String arg;
char charBuffer[20];
while (idx != -1) {
arg = cmd.substring(beginIdx, idx);
arg.toCharArray(charBuffer, 16);
data[numArgs++] = atoi(charBuffer);
beginIdx = idx + 1;
idx = cmd.indexOf(",", beginIdx);
}
// And also fetch the last command
arg = cmd.substring(beginIdx);
arg.toCharArray(charBuffer, 16);
data[numArgs++] = atoi(charBuffer);
// Now execute the command
execCmd(data);
cmdRec = false;
}
// For advanced function like switch all the leds in RGB
void execCmd(int* data) {
switch(data[0]) {
case 101:
{
for(int i = 2; i < (data[1]*2)+1; i+=2) {
pinMode(data[i], OUTPUT);
analogWrite(data[i], data[i+1]);
}
}
break;
case 102:
{
pinMode(data[1], INPUT);
int sensor = analogRead(data[1]);
Serial1.println(sensor);
}
break;
case 103:
{
String result = "";
int sensor = 0;
for(int j = 2; j < data[1]+2; j++) {
pinMode(data[j], INPUT);
sensor = analogRead(data[j]);
result += String(sensor)+",";
}
Serial1.println(result);
}
break;
default:
{
pinMode(data[0], OUTPUT);
analogWrite(data[0], data[1]);
}
break;
}
}
它不是这样编译的。因此,我取消了第二个Serial.begin行的注释,并删除了所有Serial1。代码上的外观。当我在mac上测试arduino IDE串行时,我看不到它有任何动作。因为代码是用一个有2或3个串行端口的arduino Mega编写的,所以当Mega的SERIAL1端口上有通信时,会触发void serialevent1。因为我正在处理UNO,它只有一个串行端口,所以我所要做的就是删除括号前的1,所有的工作都按预期进行
void serialEvent() { }