我想通过 Windows 窗体中的串行端口读取传感器。当我通过 RealTerm 程序连续发送所需的传感器命令时,我得到如下预期的响应:
//1st Command
OK
sS
MAz2000145222
MAz2000145222
MAz2000145222
SC
//2nd Command
OK
sS
MAz2000145222
MAz2000145222
MAz2000145222
SC
//3rd Command
OK
sS
MAz2000145222
MAz2000145222
MAz2000145222
SC
但是当我使用我的 windows 窗体应用程序并通过按下按钮发送所需的传感器命令时,我得到了这个:
//Displayed in txtBoxReceived
//1st Command
OK
sS
MAz2000145222
MAz2000145222
MAz2000145222
//2nd Command
SC
OK
sS
MAz2000145222
//3rd Command
MAz2000145222
MAz2000145222
SC
OK
sS
MAz2000145222
MAz2000145222
这是我的代码:
public partial class Form1 : Form
{
string strRecieved;
static SerialPort _SerialPort = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_SerialPort = new SerialPort("COM8", 115200, Parity.None, 8, StopBits.One);
_SerialPort.ReadTimeout = 1000;
_SerialPort.Open();
_SerialPort.DataReceived += new SerialDataReceivedEventHandler(_SerialPort_DataReceived);
}
private void _SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
strRecieved = _SerialPort.ReadLine();
this.Invoke(new EventHandler(UpdateVar));
}
private void UpdateVar(object sender, EventArgs e)
{
txtBoxReceived.Text += (strRecieved + Environment.NewLine);
}
我很困惑!有什么建议吗?
根据评论编辑:我按三下按钮发送三个命令,并且有足够的时间接收数据和更新表单。传感器发送的所有字符串都以“\n”0x0A 结尾。请注意 RealTerm 中的响应是正确的。在我看来,所有字符都已正确接收到输入缓冲区,但尚未读取的字符将出现在下一个命令中!
在您的DataRecieved
活动中,您应该构建一个字符串,直到您拥有整行。您的所有回复都以 CR LF 结尾,太好了,我们可以使用它来确定何时拥有整个字符串。
StringBuilder sb = new StringBuilder();
char LF = (char)10;
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string Data = serialPort1.ReadExisting();
foreach (char c in Data)
{
if (c == LF)
{
sb.Append(c);
CurrentLine = sb.ToString();
sb.Clear();
//do something with your response 'CurrentLine'
Eval_String(CurrentLine);
}
else
{
sb.Append(c);
}
}
}
获得 后CurrentLine
,您可以评估您的回复。我不确定你需要用它做什么,但从下面的例子你应该能够得到你的价值。
private void Eval_String(string s)
{
txtBoxReceived.Text += (s + Environment.NewLine);
}
请注意,您可能必须调用更新文本框,因为它是在您的串行端口线程中调用的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句