0

我正在使用我的 Arduino UNO 板来读取和绘制雷达显示器上的点。我正在接收到我的 PC 的串行数据,如下所示:

44.16 ; 48
44.47 ; 49
44.57 ; 50
44.88 ; 51
158.01 ; 52
44.88 ; 53

第一个数字是距离,第二个数字是舵机旋转到的度数标记。

我想获取这些数据并创建一个数组,该数组将绘制和刷新每个度数的测量值,因为伺服从 1-180 度扫描并从 180 度返回到 1 度。

这是我的代码:

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

    namespace SonarRadarProject
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                var comPorts = new string[10]; //You really shouldn't have many more than 10 ports open at a time.... Right?
                comPorts = SerialPort.GetPortNames();
                foreach (var comPort in comPorts)
                    listBoxComPorts.Items.Add(comPort);
                listBoxBaudRate.Items.Add(9600);
            }

            private void buttonConnect_Click(object sender, EventArgs e)
            {
                #region User Interface

                /*-------------------------------------------------------*
                 * --------------USER INTERFACE SECTION------------------*
                 *-------------------------------------------------------*/

                var userPortChoice = listBoxComPorts.SelectedItem;
                var userBaudChoice = listBoxBaudRate.SelectedItem;
                if ((userBaudChoice == null) || (userPortChoice == null))
                {
                    MessageBox.Show("Please select both a PORT and a BAUD rate.", "Error");
                    return;
                }
                SerialPort arduinoPort = new SerialPort()
                                             {
                                                 PortName = userPortChoice.ToString(),
                                                 BaudRate = Convert.ToInt16(userBaudChoice)
                                             };
                arduinoPort.Open();
                arduinoPort.NewLine = "\r\n";

                #endregion

                #region Real Code
                    /*-------------------------------------------------------*
                     * --------------THE REAL CODE SECTION-------------------*
                     *-------------------------------------------------------*/
                while (arduinoPort.IsOpen)
                {
                    //
                    //BEGIN making a string array based on serial data sent via USB from the Arduino UNO
                    //
                }
                #endregion
            }
        }
    }

我可以制作数组,并将度数与距离测量分开(使用 string.split 和 string.remove)。我不知道要让这些信息不断地从串行端口流入(输出行被分开,并正确格式化)并更新我的变量以获取这些数据。

我需要介绍握手吗?也许一点一点地读取这些数据并编译它?读取 inBuffer,而不是 arduinoPort.readLine()?

TLDR:我想要不断更新(实时?)、格式正确的串行数据,我可以将其分成两个变量(sonarDist 和 sonarDeg)。

尽力而为,老实说,我完全迷路了。欢迎任何建议。

4

1 回答 1

1

关于你的问题:

如果我是你,我会创建一个类似对的类,它可以帮助你封装距离/角度来定义一个位置。然后,如果需要,您可以添加一些方法来进行一些计算等。

class Location {
    public Location(float distance, float angle) {
    Distance = distance;
        Angle = angle;
    }
    public Location(String distance, String angle) {
        Distance = Convert.ToSingle(values[0]);
        Angle = Convert.ToSingle(values[1]);
    }
    public float Angle { get; private set; }
    public float Distance { get; private set; }
}

然后对于您的主循环,我假设您想要一个固定宽度的数组,因此您可以对其进行“循环”迭代,这意味着最大值之后的索引是第一个索引。在设计雷达时,您需要在每一轮迭代中用新值替换旧值。

int MAX_LOCATIONS = 360; // let's assume there's 1 value per degree

Location[] radarmap = new Location(MAX_LOCATIONS);
int radar_idx = 0;

while (arduinoPort.IsOpen) {
    //BEGIN making a string array based on serial data sent via USB from the Arduino UNO
    String[] values = ArduinoPort.ReadLine().Split(' ; ');
    radarmap[radar_idx] = Location(values[0], values[1]);
    // as you're working on a radar, I assume you need to overwrite values once you've made 360 degrees
    if (++radar_idx == MAX_LOCATIONS)
        radar_idx = 0;
}

但是,不要像您问的那样使用数组,我认为使用哈希图会更好,因为您的角度保持不变:

while (arduinoPort.IsOpen) {
    Hashtable locations = new Hashtable();
    String[] values = ArduinoPort.ReadLine().Split(' ; ');
    locations[values[0]] = values[1]; // key is the angle, value is the distance
}

它使代码方式更简单,但这完全取决于您的约束,因此选择取决于您。

免责声明:我不是 C# 程序员(这是我一生中第二次编写 C#),所以这个例子绝不是完整的,甚至是可编译的。但我已经用谷歌搜索了对象的语法和 API 参考,看起来还不错。

关于你的评论:

  • 您应该将换行设置设置为\n(unix end-of-line) 而不是\r\n(windows end-of-line),因为它是 arduino 的默认设置Serial.println()
于 2013-06-21T11:07:51.140 回答