// 车运行 private static void Car_run() { var temp = new float[4]; //四个电机的速度 int v, vdif, v_f; //车速度和差速 var coefficient = 0; while (true) { if (Trans_error_count >= tansError) { Trans_Error(); //通信失常 } if (buffer[0] != 0x01 && buffer[0] != 0x02 && buffer[0] != 0x03 && buffer[0] != 0x04) { break; //跳出循环判断 } v = buffer[2]; if (v >= 99) { v = 99; } if (v <= 2) { v = 0; } vdif = buffer[3] * v / 90; switch (buffer[0] * 10 + buffer[1]) //10,11,12,13,14,20,21,22,23,24,30,32,34,40,42,44 { case 10: case 20: case 30: case 40: temp[0] = 0; temp[1] = 0; temp[2] = 0; temp[3] = 0; break; case 11: case 21: temp[0] = v - vdif; temp[1] = v - vdif; temp[2] = v * -1; temp[3] = v * -1; break; case 12: case 22: temp[0] = v; temp[1] = v; temp[2] = (v - vdif) * -1; temp[3] = (v - vdif) * -1; break; case 13: case 23: v_f = v * 8 / 10; temp[0] = -v_f; temp[1] = -v_f; temp[2] = (-v_f + vdif) * -1; temp[3] = (-v_f + vdif) * -1; break; case 14: case 24: v_f = v * 8 / 10; temp[0] = -v_f + vdif; temp[1] = -v_f + vdif; temp[2] = -v_f * -1; temp[3] = -v_f * -1; break; case 32: case 42: temp[0] = v; temp[1] = v; temp[2] = v; temp[3] = v; break; case 34: case 44: temp[0] = -v; temp[1] = -v; temp[2] = -v; temp[3] = -v; break; default: temp[0] = 0; temp[1] = 0; temp[2] = 0; temp[3] = 0; break; } switch (buffer[0]) { case 1: case 3: coefficient = velocityMax; break; case 2: case 4: coefficient = 2 * velocityMax; break; } //写入速度 for (byte add = 0x01; add < 0x05; add++) { try { com.Write(CarControl.CarSpeedWrite(add, coefficient * temp[add - 1]), 0, 8); } catch (Exception e) { mainLog.WriteLog("串口写入失败", e.ToString()); } Thread.Sleep(serial_time); } Thread.Sleep(cpu_time); //延时降低CPU负担 #if DEBUG //读取电流 for (byte add = 0x01; add < 0x05; add++) { try { com.Write(CarControl.CurrentRead(add), 0, 8); } catch (Exception e) { mainLog.WriteLog("串口写入失败", e.ToString()); } Thread.Sleep(serial_time); } #endif } }
private static void Main_init() { //打开服务器 tcpServer.Start(); //注册串口接收方法 com.NewLine = "\r\n"; com.DataReceived += com_DataReceived; //打开io口及继电器 gpio.InitIo(); gpio.SetIoHigh(); SetIoH = true; #if TEST com.WriteBufferSize = 80;//必须偶数对齐 //打开串口 if (!com.IsOpen) { try { com.Open(); Console.WriteLine("打开串口成功"); } catch (Exception e) { com = new SerialPort(); Console.WriteLine("打开串口失败" + e.ToString()); } } Console.WriteLine(com.WriteBufferSize); //com.WriteTimeout = 5; for (byte add = 0x01; add < 0x05; add++) { try { com.Write(CarControl.CarSpeedWrite(add, 20), (add - 1) * 8, 8); Thread.Sleep(30); } catch (Exception e) { Console.WriteLine("串口写入失败 " + e.ToString()); } } if (com.IsOpen) { try { com.Close(); Console.WriteLine("关闭串口成功"); } catch (Exception e) { com = new SerialPort(); Console.WriteLine("关闭串口失败" + e.ToString()); } } #endif //启动timer var dogTimer = new Timer(timerInterval); dogTimer.Elapsed += time_tick; //到达时间的时候执行事件; dogTimer.AutoReset = true; //设置是执行一次(false)还是一直执行(true); try { dogTimer.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件; } catch (Exception e) { mainLog.WriteLog("看门狗使能失败", e.ToString()); } }