gjx_12 2018-10-15 15:29 采纳率: 0%
浏览 1939
已结题

Arduino 串行口通信死机

 int servo1Pin=3;            // 右肩膀控制的舵机
int servo2Pin=5;            // 右胳膊控制的舵机
int servo3Pin=6;            // 左手上下控制的舵机  Y
int servo4Pin=9;            // 左手左右控制的舵机  X
int servo5Pin=10;           // 左手抓握控制机械臂

int pulse1=1700;
int pulse2=1600;   
int pulse3=1450;
int pulse4=1700;
int pulse5=500;

unsigned long previousMillis=0;  //起始时间
long interval=20;               //20ms
//初始位置
int angle[5]={190,190,190,190,280};
int temp[15];
/*
int angle1=190;  
int angle2=190;                  
int angle3=190;  
int angle4=190;
int angle5=190;
*/  
char stroke;                    //Serial接收标志位
int i=0;
int flag=0;
void setup() {
  // put your setup code here, to run once:
  pinMode(servo1Pin,OUTPUT);
  pinMode(servo2Pin,OUTPUT);
  pinMode(servo3Pin,OUTPUT);
  pinMode(servo4Pin,OUTPUT);
  pinMode(servo5Pin,OUTPUT);
  Serial.begin(9600);               //开启Serial
}

void loop() {
  // put your main code here, to run repeatedly:

  if(Serial.available()>0)       
  {

    stroke=Serial.read();
    Serial.println(stroke);
    delay(20);
     if(stroke=='s')                //起始标志为s

    {
      for(int i=0;i<5;i++)
      {
        temp[i]=Serial.read();
        temp[i+1]=Serial.read();
        temp[i+2]=Serial.read();
        angle[i]= (temp[i]-48)*100+(temp[i+1]-48)*10+(temp[i+2]-48)*1;
        Serial.println(angle[i]);

        }

    }

   }
   for(int j=0;j<4;j++)
   {
      if(angle[j]>280) 
      {
        Serial.println("太大了");
        angle[j]=280;
        }
      if(angle[j]<100) 
      { angle[j]=100;}

   }
   if(angle[4]==280)
   {
    pulse5=1000;
    }
   if(angle[4]==100)
   {

    pulse5=500;

    }


   /*
   for(int k=0;k<5;k++)
   {
      Serial.println(angle[k]);

    }
    */

   pulse1=(int)map(angle[0],100,280,850,2600); 
   pulse2=(int)map(angle[1],100,280,2400,800); 
   pulse3=(int)map(angle[2],100,280,400,2500);
   pulse4=(int)map(angle[3],100,280,800,2600);
   //pulse5=(int)map(angle[4],100,280,500,2500);
  unsigned long currentMillis=millis();
  if(currentMillis-previousMillis>interval)
  {
      previousMillis=currentMillis;
      updateServo(servo1Pin,pulse1);
      updateServo(servo2Pin,pulse2);
      updateServo(servo3Pin,pulse3);
      updateServo(servo4Pin,pulse4);
      updateServo(servo5Pin,pulse5);
  }

}
void updateServo(int pin,int pulse)
{
    digitalWrite(pin,HIGH);
    delayMicroseconds(pulse);
    digitalWrite(pin,LOW);

  }

我用C#做上位机与arduino做了一个机械臂系统 C#串行口发送数据 在刚运行的时候arduino运行十分流畅 但是过大概两三分钟 arduino就会卡死 且Rx Tx的灯都变成常亮而不是正常通信的时候的闪烁状态了 我是用arduino控制舵机 舵机单独供电 arduino USB供电 没有单独9V供电 通过commonitor监视当arduino死机的时候 C#发送数据正常 且降低发送频率运行时长会增加 但不会超过五分钟 具体该如何解决 arduino的代码是将C#数据转为int
并驱动舵机

  • 写回答

3条回答 默认 最新

  • devmiao 2018-10-15 15:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效