因此,我从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/