串行通信问题

时间:2015-03-03 04:35:10

标签: c# serial-port

我在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);
}

2 个答案:

答案 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();  
 }