C# SerialPort 连续读取命令响应
C# SerialPort read command response continuously
我有一个 class 必须连续读取一个位置
我只能读取位置一次,所以我如何连续发送命令并读回其响应
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
class应该可以实现这个。你很接近。请注意,您应该在打开端口之前创建 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
命令。
我有一个 class 必须连续读取一个位置 我只能读取位置一次,所以我如何连续发送命令并读回其响应
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
class应该可以实现这个。你很接近。请注意,您应该在打开端口之前创建 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
命令。