首页 > 解决方案 > 我想从串行端口读取电位器的 int,但它一直显示我(4⸮⸮⸮⸮j⸮/⸮。)

问题描述

所以我从一个 Arduino Uno 发送一个来自电位器的整数(0 - 1023),当我阅读它并将其打印在标签上时,没有数字。我在某个地方读到了我需要读取字节的地方,我怎么样打算这样做吗?

namespace Receiver
{
    public partial class Form1 : Form
    {
        SerialPort port;
        UITimer _timer = new UITimer();

        public Form1()
        {
            InitializeComponent();

            if (port == null)
            {
                port = new SerialPort("COM11", 9600);//Set your board COM
                port.Open();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _timer.Interval = 200;
            _timer.Tick += _timer_Tick;
            _timer.Enabled = true;
            _timer.Start();
        }

        private void _timer_Tick(object sender, EventArgs e)
        {

            string a = port.ReadExisting();
            afisare.Text = a;
        }

        void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            _timer.Stop();
            if (port != null && port.IsOpen)
            {
                port.Close();
            }
        }
    }
}

标签: c#arduino

解决方案


首先,确保您使用正确的波特率进行串行通信,否则您将收到不可读的数据。

您的代码只是缺少对传入数据的正确解释。最重要的是,我建议删除计时器并使用内置DataReceived事件。这意味着您可以删除所有与计时器相关的代码并在SerialPort初始化中添加事件处理程序:

if (port == null)
{
    port = new SerialPort("COM11", 9600); //Set your board COM
    port.DataReceived += DataReceivedEvent;
    port.Open();
}

然后你当然必须声明你的DataReceivedEvent处理程序。既然你说你的电位器可以包含 0-1023 范围内的值并且你没有提供你的 Arduino 代码,我假设这是唯一通过端口发送的东西。这意味着您每个周期发送 2 个字节,需要将其解析回整数。

这通过执行两个接收到的字节的左移来工作。

private void DataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort senderPort = (SerialPort)sender;

    byte[] buffer = new byte[2];

    if (senderPort.Read(buffer, 0, 2) != 0)
    {
        int data = (int)buffer[0] << 8 | buffer[1];
        Console.WriteLine("Received data: {0}", data);
    }
}

推荐阅读