因此,我从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();
            }
        }
    }
}

最佳答案

首先,请确保您使用正确的Baud rate进行串行通信,否则将收到无法读取的数据。

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

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


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

这通过对两个接收字节执行left shift来工作。

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

关于c# - 我想从串行端口读取电位计的整数,但它一直显示(4⸮⸮⸮⸮j⸮/⸮。),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57466115/

10-11 01:51