c# - C# SerialPort 连续读取命令响应
问题描述
我有一个必须连续读取位置的类我能够读取位置但只能读取一次,那么我将如何连续发送命令并读回它的响应
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SharpRotor.Lib
{
public class SharpRotorL
{
string PortName;
int BaudRate;
public SharpRotorL(string PortName, int BaudRate)
{
this.PortName = PortName;
this.BaudRate = BaudRate;
}
SerialPort sp = new SerialPort();
public void test()
{
sp.NewLine = "\r\n";
sp.PortName = this.PortName;
sp.BaudRate = this.BaudRate;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.None;
sp.DtrEnable = true;
sp.WriteBufferSize = 1024;
string t = "";
int timeout = 10000; //t: response msg
try
{
if (!sp.IsOpen)
sp.Open();
Thread.Sleep(200);
sp.BaseStream.Flush();
sp.WriteLine("C"); //Ex: cmd=C to get Position (+0001)
sp.BaseStream.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
private void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
}
}
除了异步读取,我还想在读取位置数据的同时发回一些命令
不确定这是否可能,如果可能的话,我很想知道一种方法。
解决方案
使用类应该可以实现这一点Timer
。你很接近。请注意,您应该DataReceived
在打开端口之前创建您的事件。
SerialPort sp;
Timer tm;
private void init_ports()
{
//Setup our Serial Port
sp = new SerialPort();
sp.NewLine = "\r\n";
sp.PortName = this.PortName;
sp.BaudRate = this.BaudRate;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.None;
sp.DtrEnable = true;
sp.WriteBufferSize = 1024;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
//Setup our Timer
tm = new Timer();
tm.Tick += new EventHandler(tm_Tick);
tm.Interval = 1000; //in ms
tm.Enabled = true; //Start our timer
}
void tm_Tick(object sender, EventArgs e)
{
if (!sp.IsOpen)
sp.Open();
sp.Write("C");
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
您应该能够调用init_ports
,并且它应该每秒发送一次C
命令。
推荐阅读
- azure - 如何在数据工厂中接收 http 帖子?
- flutter - Flutter how to take a photo with custom width and height
- azure - 模板语言函数 'div' 期望它的第一个参数是整数或十进制数
- javascript - 单击按钮时重置表格内容不起作用
- python - 如何提高python中虚线图的效率(速度)
- sql-server - PostgreSQL 中 SQL Server 中“@@PROCID”系统变量的等效项
- reactjs - 如何使用react redux防止对象中的重复数据
- python - Pandas Dataframe 中使用 NLTK 包的句子标记化
- javascript - 当我更改另一个 SelectBox 的值时,如何启用其他 SelectBox 值?
- python - Flask-SqlAlchemy 加载大量数据后插入速度极慢