简体   繁体   中英

c# serial port cannot read data from arduino

For a school project I am creating a pong game connected to the arduino, where if you hold a button pressed the racket moves in one direction and if you don't it moves in the other. The game works fine if I don't use arduino data as an input. I tried using different functions but it doesnt work.

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');
  }
  }
}

I would suggest putting a breakpoint in timer1_Tick, I suspect it is not going to be called at all because you haven't called

 timer1.Start();

to start the timer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM