我在c#中编写了一个代码,用于通过串行通信接收数据并将其显示在文本框中。我能够做到这一点。但我收到以下格式的数据,例如
1234 2345 3456 5667 或
下一行中的每个字节.. 但我希望每个传入的字节都应该覆盖前一个字节,在文本框中我们只能看到1个字节,然后是另一个字节覆盖前一个字节。
请建议怎么做?
private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = SerialPort.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
}
private void DisplayText(object sender, EventArgs e)
{
txtIncomingData.AppendText(RxString);
}
答案 0 :(得分:0)
您将每个收到的数据附加到文本框中!这是一种预期的行为。每次要显示新接收的数据时,您应该更改textBox.Text
值。
更改DisplayText
方法:
private void DisplayText(object sender, EventArgs e)
{
txtIncomingData.AppendText(RxString);
}
到
private void DisplayText(object sender, EventArgs e)
{
txtIncomingData.Text = RxString;
}
P.S:我假设txtIncomingData
是一个textBox控件,如果我错了就纠错我
答案 1 :(得分:0)
下面的解决方案有效,但它在数据之间提供空白字节。
SerialPort serialPort;
private delegate void SetTextDeleg(string text);
private void Form1_Load(object sender, EventArgs e)
{
serialPort= new SerialPort("COM6", 4800, Parity.None, 8, StopBits.One);
serialPort.Handshake = Handshake.None;
serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
serialPort.ReadTimeout = 500;
serialPort.WriteTimeout = 500;
serialPort.Open();
}
private void btnStart_Click(object sender, EventArgs e)
{
try
{
if(!serialPort.IsOpen)
serialPort.Open();
}
catch (Exception ex)
{
MessageBox.Show("Could not open Serial Port");
}
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
string data = serialPort.ReadLine();
this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
}
private void si_DataReceived(string data)
{
txtIncomingData.Text = data.Trim();
}