Python Pyserial未正确读取串行输入并引发错误
我正在编写一个代码,使用pyserial从arduino读取串行输入。输入字符串应该类似于“2786,7258.00,10,20,5,0200004809.14,N,1131.70,E”,但pyserial给出的是“286,9246.00,10,20,0200004809.74,N,131.90,E”,几秒钟后程序也会出现错误Python Pyserial未正确读取串行输入并引发错误,python,arduino,pyserial,Python,Arduino,Pyserial,我正在编写一个代码,使用pyserial从arduino读取串行输入。输入字符串应该类似于“2786,7258.00,10,20,5,0200004809.14,N,1131.70,E”,但pyserial给出的是“286,9246.00,10,20,0200004809.74,N,131.90,E”,几秒钟后程序也会出现错误 Traceback (most recent call last): File "/home/saurabh/Desktop/testreception.py"
Traceback (most recent call last):
File "/home/saurabh/Desktop/testreception.py", line 14, in <module>
main()
File "/home/saurabh/Desktop/testreception.py", line 9, in main
x.append(ser.readline())
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
`SerialException: device reports readiness to read but returned no data (device disconnected?)
arduino代码是:
int TEAM_ID = 2786;
int h = 00;
int m = 00;
int s = 00;
int MISSION_TIME = s*1 + m*100 + h*10000;
float ALT_SENSOR = 300;
int OUTSIDE_TEMP = 10;
int INSIDE_TEMP = 20;
int VOLTAGE = 12;
int FSW_STATE = 0;
int ROTOR_RATE = 2000;
float LATTITUDE = 4807.038;
char LAT_CHAR = 'N';
float LONGITUDE = 01131.0000;
char LON_CHAR = 'E';
int i = 1, j = 1;
void intialize()
{
h = 00;
m = 00;
s = 00;
MISSION_TIME = 0;
ALT_SENSOR = 300;
OUTSIDE_TEMP = 10;
INSIDE_TEMP = 20;
VOLTAGE = 12;
FSW_STATE = 0;
LATTITUDE = 4807.038;
LONGITUDE = 01131.0000;
i = 1; j = 1;
}
void setup(){
Serial.begin(9600);
}
void loop()
{
Serial.print(TEAM_ID); Serial.print(',');
Serial.print(MISSION_TIME); Serial.print(',');
Serial.print(ALT_SENSOR); Serial.print(',');
Serial.print(OUTSIDE_TEMP); Serial.print(',');
Serial.print(INSIDE_TEMP); Serial.print(',');
Serial.print(VOLTAGE); Serial.print(',');
Serial.print(FSW_STATE); Serial.print(',');
Serial.print(ROTOR_RATE); Serial.print(',');
Serial.print(LATTITUDE); Serial.print(',');
Serial.print(LAT_CHAR); Serial.print(',');
Serial.print(LONGITUDE); Serial.print(',');
Serial.print(LON_CHAR);
Serial.print('\n');
delay(1000);
MISSION_TIME += i;
j += 1;
if(s>59)
{
m=m+1;
s += 1;
}
if(m>60)
{
h=h+1;
}
if(j==20)
{
FSW_STATE = 3;
}
if(j==30)
{
FSW_STATE = 4;
}
if(j==40)
{
FSW_STATE = 5;
}
if(j==50)
{
FSW_STATE = 6;
}
OUTSIDE_TEMP += 0.3;
INSIDE_TEMP += 0.2;
VOLTAGE -= 0.2;
ALT_SENSOR -= 6;
s += 1;
LATTITUDE += 0.3;
LONGITUDE += 0.1;
if(ALT_SENSOR == 0)
{
intialize();
}
loop;
}
是否可能还包括arduino代码?现在看来,这段python代码没有什么严重错误。这可能暗示您对从arduino返回的字符串的假设是错误的。代码已经包含在内,请检查并告知!)提前谢谢!在你的Arduino代码中有很多东西我需要改变,例如,在循环结束时,不要调用
循环
(实际上,你甚至没有调用它,你只是写下名称),这将导致无限递归。同样,你的秒、分钟、小时都在界外:考虑使用模算符。你能指定你在哪个Arduino板上运行这个吗?另外,我在这个问题中添加了arduino标记,因为问题不在于python。实际上,您确定代码已上载到arduino吗?您显示的代码不可能改变团队ID,但pyserial返回的就是这个代码?事实上,我在Arduino Uno上运行了这个代码,代码是上传的,因为我可以在Arduino IDE的串行监视器中看到结果。我需要一个无限循环,我想不断地读代码,直到python程序终止。是的,团队ID并没有改变!问题是pyserial在读取时丢失了数据!谢谢你的帮助,先生!
int TEAM_ID = 2786;
int h = 00;
int m = 00;
int s = 00;
int MISSION_TIME = s*1 + m*100 + h*10000;
float ALT_SENSOR = 300;
int OUTSIDE_TEMP = 10;
int INSIDE_TEMP = 20;
int VOLTAGE = 12;
int FSW_STATE = 0;
int ROTOR_RATE = 2000;
float LATTITUDE = 4807.038;
char LAT_CHAR = 'N';
float LONGITUDE = 01131.0000;
char LON_CHAR = 'E';
int i = 1, j = 1;
void intialize()
{
h = 00;
m = 00;
s = 00;
MISSION_TIME = 0;
ALT_SENSOR = 300;
OUTSIDE_TEMP = 10;
INSIDE_TEMP = 20;
VOLTAGE = 12;
FSW_STATE = 0;
LATTITUDE = 4807.038;
LONGITUDE = 01131.0000;
i = 1; j = 1;
}
void setup(){
Serial.begin(9600);
}
void loop()
{
Serial.print(TEAM_ID); Serial.print(',');
Serial.print(MISSION_TIME); Serial.print(',');
Serial.print(ALT_SENSOR); Serial.print(',');
Serial.print(OUTSIDE_TEMP); Serial.print(',');
Serial.print(INSIDE_TEMP); Serial.print(',');
Serial.print(VOLTAGE); Serial.print(',');
Serial.print(FSW_STATE); Serial.print(',');
Serial.print(ROTOR_RATE); Serial.print(',');
Serial.print(LATTITUDE); Serial.print(',');
Serial.print(LAT_CHAR); Serial.print(',');
Serial.print(LONGITUDE); Serial.print(',');
Serial.print(LON_CHAR);
Serial.print('\n');
delay(1000);
MISSION_TIME += i;
j += 1;
if(s>59)
{
m=m+1;
s += 1;
}
if(m>60)
{
h=h+1;
}
if(j==20)
{
FSW_STATE = 3;
}
if(j==30)
{
FSW_STATE = 4;
}
if(j==40)
{
FSW_STATE = 5;
}
if(j==50)
{
FSW_STATE = 6;
}
OUTSIDE_TEMP += 0.3;
INSIDE_TEMP += 0.2;
VOLTAGE -= 0.2;
ALT_SENSOR -= 6;
s += 1;
LATTITUDE += 0.3;
LONGITUDE += 0.1;
if(ALT_SENSOR == 0)
{
intialize();
}
loop;
}