簡體   English   中英

C# Visual Studio 用於通過串行方式向 arduino 發送數據的計算機程序 (C)

[英]C# Visual studio Computer program for sending data by Serial to arduino (C)

我正在嘗試制作一個用於控制軸伺服的程序,但在通過串行(USB)向 Arduino 發送值時遇到了一個小問題。 數據似乎沒有以正確的格式到達。 出於測試目的,我制作了一個特殊的 Arduino 代碼,看看有什么問題。

Arduino 代碼:

 void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600);


}
String received;
void loop() {
 
  // put your main code here, to run repeatedly:
  if(Serial.available()>0)
  {
  received=Serial.readString();
  }
  
  Serial.println("received: "+received);
  
 
}

C# 代碼:

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;
using System.Threading;

namespace ServoControl
{
    public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        SerialPort Sp = new SerialPort();
        String AngleX = "0";
        String AngleY = "0";
        String AngleZ = "0";
        String rec = "";
        private void Form1_Load(object sender, EventArgs e)
        {
            
            Sp.PortName = "COM8";
            Sp.BaudRate = 9600;
            Sp.DataReceived += Sp_DataReceived;
           
        }

        private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            rec=Sp.ReadLine();

        }
        //when value changed on slider
        private void xAxisServo_Scroll(object sender, EventArgs e)
        {
            if (AngleX!= xAxisServo.Value.ToString()) 
            { 
                AngleX = xAxisServo.Value.ToString(); valueXaxis.Text = AngleX; 
            }

            if (Sp.IsOpen == true & int.Parse(AngleX) <= 180)
            {
                Sp.WriteLine(AngleX.ToString());
            }

            else
            {
                Sp.Open();
            }
        }
        //when value changed in value box
        private void valueXaxis_TextChanged(object sender, EventArgs e)
        {
            if (int.TryParse(valueXaxis.Text, out int res)==true && int.Parse(valueXaxis.Text)<=180) 
            { 
                AngleX = valueXaxis.Text;
                xAxisServo.Value = int.Parse(AngleX); 
            }

            if (int.TryParse(valueXaxis.Text, out int res2) == true && int.Parse(valueXaxis.Text) > 180) 
            { 
                AngleX = "180";
              
            }


            if (Sp.IsOpen == false) 
            { 
                Sp.Open(); 
            }

            if (Sp.IsOpen == true) 
            { 
                Sp.WriteLine(AngleX.ToString());

            }
           
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            textBox1.Text = rec;
        }

    }
}

我能夠通過 function Serial.parseInt() 為軸 X 發送一個值; 我能夠從 Arduino 中的字符串中讀取一個值,但我需要發送多個,並且在發送和接收字符串時遇到問題。

I have tested a lot with Arduino serial monitor and it seems when sending through builtin monitor in Arduino IDE it works as expected got correct string back, but when using C# checking through textbox1 it shows only received and when not interrupted shows an only bunch of nonsense每一秒都在變化。 對此,我嘗試用 Write 替換 WriteLine,因為我不太了解 Arduino 的背景,所以我不知道 Arduino 如何使用 Serial.readString Serial.readString();處理數據。 .

我試圖找到 Arduino IDE 中的內置串行監視器是如何工作的
知道為什么我使用 IDE 串行監視器和 C# 得到不同的結果。

連接 Serial.read 然后添加一個終止字符來切斷連接:

char received;

while(Serial.available()>0)
{
  if(received=='#') // put the # in the end of your data
  { 
   Serial.println("received: "+String(received));
   break;
  }
  received+=Serial.read();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM