2016-11-23 58 views
0

对于一个学校项目,我创建了一个连接到arduino的pong游戏,如果你按住一个按钮,球拍向一个方向移动,如果你不在另一个方向移动。如果我不使用arduino数据作为输入,游戏会正常工作。我试过使用不同的功能,但它不起作用。c#串口不能从arduino读取数据

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 

namespace pong 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 

     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 




    namespace pong 
    { 

     public partial class Form1 : Form 
     { 
      SerialPort port1 = new SerialPort(); 
      public int points = 0; 
      public int speed_left = 0; 
      public int speed_top = 0; 
      public Form1() 
      { 

       InitializeComponent(); 
       timer1.Enabled = true; 
       Cursor.Hide(); //skrije kurzor 
       this.TopMost = true; 
       this.Bounds = Screen.PrimaryScreen.Bounds; 
       this.FormBorderStyle = FormBorderStyle.None; 
       racket.Top = panel1.Bottom - (panel1.Bottom/10); 
       SerialPort port1 = new SerialPort("COM3"); 
       port1.BaudRate = 9600; 
       port1.Parity = Parity.None; 
       port1.StopBits = StopBits.One; 
       port1.DataBits = 8; 
       port1.Handshake = Handshake.None; 
       port1.RtsEnable = true; 
       port1.Open(); 


      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 

      } 

      private void timer1_Tick(object sender, EventArgs e) 
      { 
       if(!port1.IsOpen) 
       { 
        port1.Open(); 
        port1.ReadTimeout = 1000; 
       } 
       if (port1.IsOpen) 
       { 
        if (port1.ReadExisting()=="") 
        { 
         racket.Left = racket.Left - 0; 
        } 
        else 
        { 
         racket.Left = racket.Left + 10; 
        } 
       } 

       ball.Left += speed_left; 
       ball.Top += speed_top; 

       if(ball.Bottom >=racket.Top && ball.Bottom <= racket.Bottom && ball.Left >= racket.Left && ball.Right <= racket.Right) 
       { 
        speed_left += 2; 
        speed_top += 2; 
        speed_top = -speed_top; 
        points += 1; 
        label2.Text = points.ToString(); 


       } 

       if(ball.Left<=panel1.Left) 
       { 
        speed_left = -speed_left; 
       } 
       if (ball.Right >= panel1.Right) 
       { 
        speed_left = -speed_left; 
       } 
       if(ball.Top <= panel1.Top) 
       { 
        speed_top = -speed_top; 
       } 
       if(ball.Bottom>=panel1.Bottom) 
       { 
        timer1.Enabled=false; 
       } 
      } 

      private void Form1_KeyDown(object sender, KeyEventArgs e) 
      { 
       if(e.KeyCode==Keys.Escape) 
       { 
        this.Close(); 
       } 
      } 

      private void label1_Click(object sender, EventArgs e) 
      { 

      } 

     } 
    } 

的Arduino:

void setup() { 
    // put your setup code here, to run once: 
    pinMode(8,INPUT); 
    digitalWrite(8,LOW); 
} 

void loop() { 
    Serial.begin(9600); 
    while(1){ 
    if(digitalRead(8)==HIGH) 
    { 
    Serial.write('1'); 
    } 
    } 
} 
+0

你排除了硬件问题吗? –

+0

是的,我已经tryed发送串行数据到另一个程序,它的工作。 –

+0

如果您试图将PC连接到arduino,您可能会发现需要一个适配器来转换不同的电压级别:http://stackoverflow.com/questions/25020887/serial-communication-between-pc-and-arduino -via-RS232-使用-C – PaulF

回答

0

我建议把一个断点timer1_Tick,我怀疑它是不会在所有因为你没有叫

timer1.Start(); 

到名为启动计时器。