【问题标题】:C# Visual studio Computer program for sending data by Serial to arduino (C)C# Visual Studio 计算机程序,用于通过串行向 arduino (C) 发送数据
【发布时间】:2021-04-15 23:16:07
【问题描述】:

我正在尝试制作一个用于控制轴伺服的程序,但在通过串行 (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;
        }

    }
}

我能够通过函数 Serial.parseInt(); 为轴 X 发送一个值;我能够从 Arduino 中的字符串中读取一个值,但我需要发送多个值,而且我在发送和接收字符串时遇到问题。

我已经用 Arduino 串行监视器进行了很多测试,似乎在通过 Arduino IDE 中的内置监视器发送时,它按预期工作,得到了正确的字符串,但是当使用 C# 检查通过 textbox1 时,它显示只收到,当不中断时只显示一个一堆废话每秒都在变化。 对此,我尝试将 WriteLine 替换为 Write,因为我不太了解 Arduino 的背景,所以我不知道 Arduino 如何使用 Serial.readString(); 处理数据。

我试图找出 Arduino IDE 中的内置串行监视器在 C# 中是如何工作的,或者如果不是在 C# 中,至少数据是如何发送的。
知道为什么我使用 IDE 串行监视器和 C# 会得到不同的结果。

【问题讨论】:

    标签: c# c visual-studio arduino serial-port


    【解决方案1】:

    连接 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多