我从设备流式传输数据,我需要找到一种方法来捕捉" line end"符号结束这个符号的分隔线像任何像超级终端那样的软件。 但我无法抓住这个象征。
目前我收到的流看起来像这样:
<00> 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0但我需要在Windows窗体的textBox中看起来像这样:
)0 00 00
)0 00 00
)0 00 00
)0 00 00
)0 00 00
)0 00 00
我已经制作了一个代码,当它找到特定的字符串时会将流式字符串分开,但是对于&#34; bind&#34;那个字符串很棘手。我知道应该是ASCII ASCII字符,但是我找不到如何将它编码到我的程序和使用的方式。
P.S。实际上,当我简单地复制这个特征时,#34;&#34;到特定的texBox,然后应用于变量并在程序中使用,它的工作原理,但它看起来像是错误的移动方式,因为我不能将它直接粘贴到字符串变量中的Visual Studio中。
我使用此事件代码从串行端口接收数据:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
this.Invoke(new EventHandler(write_to_field));
}
catch (ObjectDisposedException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (ArgumentException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (InvalidOperationException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
这是我使用的方法:
public void write_to_field(object sender, EventArgs e)
{
String stringToShow;
String delimiter = textBox4.Text;
if (textBox5.Text.Length <= Convert.ToInt16(textBox3.Text))
{
String DispString;
String toFind = textBox4.Text;
DispString = serialPort1.ReadExisting();
int index = DispString.IndexOf(toFind);
textBox5.AppendText(DispString);
if (index != 0)
{
textBox5.AppendText(DispString.Remove(0, 1));
}
}
else
{
stringToShow = textBox5.Text;
textBox6.Text = stringToShow;
textBox5.Text = "";
}
}
我认为它远非完美,所以我也非常感谢有关它的建议。
在建议后,我重新编写了这样的代码:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
write_to_field();
}
public void write_to_field()
{
serialPort1.NewLine = "/r/n";
try
{
textBox1.Text = serialPort1.ReadLine();
}
catch (TimeoutException ex)
{
MessageBox.Show(Convert.ToString(ex), "Some title", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (System.IO.IOException ex)
{
MessageBox.Show(Convert.ToString(ex), "Some title", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (ObjectDisposedException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (ArgumentException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (InvalidOperationException ex)
{
MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
但是有System.IO.IOException https://msdn.microsoft.com/en-us/library/ms164917.aspx 意味着没有什么可读的。但这可能是因为Hyperterm可以阅读它。
我尝试使用ReadLine,当我启动项目但它也没有用。我很冷,没有找到任何好的解决方案这可能有什么问题?
答案 0 :(得分:0)
感谢您或提供有关实施的更多详情。
基于此,我看到你正在调用serialPort1.ReadExisting()
方法。这将读取存储在serialPort缓冲区中的所有现有数据。您可以尝试指定换行符,并将其添加到SerialPort
NewLine
属性中。然后遍历SerialPort.ReadLine
方法,该方法只读取缓冲区中的数据,直到命中下一个NewLine
字符串。
有关详细信息,请参阅文档:NewLine,ReadLine with example
编辑:
根据ReadLine
方法的文档,ReadLine
方法只应抛出InvalidOperationException
和TimeoutException
。当我抛出IOException
时,我认为可能还有其他错误。异常消息说什么,堆栈跟踪是什么?有没有Inner Exceptions
?