c# - 我想从串行端口读取电位器的 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();
}
}
}
}
解决方案
首先,确保您使用正确的波特率进行串行通信,否则您将收到不可读的数据。
您的代码只是缺少对传入数据的正确解释。最重要的是,我建议删除计时器并使用内置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);
}
}
推荐阅读
- java - Java Reactive stream如何在流的下一步还需要被映射的对象时映射对象
- ruby - 堆栈级别太深的 ruby 序列化程序,没有第二级的序列化程序
- svelte - 如何将键盘导航添加到苗条的应用程序(窗口对象除外)?
- node.js - 如何将缓冲区数据从 Nodejs 中的 readable.stream 写入文件?
- python - cmd的python_input txt文件
- hl7-fhir - FHIR 麻醉记录的官方结构?
- angular - 阿波罗角服务
- c++ - 随机输出高于应有的数字
- javascript - DOM 正在接收空字符串
- reactjs - 如何减少反应js中的地图内容