2015-12-31 64 views
-1

我遇到串口數據問題。我設計了一個表單,我使用了datareceived處理程序事件,並且需要在放置在表單中的RichTextBox中打印整個數據。問題是我只接收RichTextBox上的最後幾位數據,而隨代碼提供的MessageBox部分運行整個數據。請提出我要去哪裏錯。提前感謝。串口數據收集

public partial class Form1 : Form 
    { 
     char po='\0'; 
     string indata,pi; 
     string[] buffer; 
     public Form1() 
     { 
      InitializeComponent(); 
      System.ComponentModel.IContainer components = new System.ComponentModel.Container(); 
      serialPort1 = new System.IO.Ports.SerialPort(components); 
      serialPort1.PortName = "COM1"; 
      serialPort1.BaudRate = 9600; 
      serialPort1.DtrEnable = true; 

      serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 
      serialPort1.Open(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      SerialPort sp = (SerialPort)sender; 
      po = Convert.ToChar(serialPort1.BytesToRead); 


      indata = sp.ReadExisting(); 
      //return (indata); 
       //for (int p = 0; p <= 256; p++) ; 
       //MessageBox.Show(buffer[0]); 



      //MessageBox.Show(indata); 
      //richTextBox1.Text += indata; 
      //richTextBox1.Text = indata; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      richTextBox1.WordWrap = true; 
      richTextBox1.Text = indata; 
     } 


    } 
+0

你在讀什麼樣的數據以及多少字節被同時發送? – dbasnett

回答

0

嘗試這種代碼....

private string StrValue = ""; 
private void Port_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    double DouRWeight = 0;  
    try 
    { 
     DouRWeight = Val.ToDouble(Port.ReadLine()); 
     if (DouRWeight != 0) 
     { 
      this.Invoke((System.Windows.Forms.MethodInvoker)delegate() 
      { 
       StrValue = Val.Format(DouRWeight.ToString(), "####0.000"); 
      } 
     } 
    } 
} 
private void button1_Click(object sender, EventArgs e) 
{ 
     richTextBox1.WordWrap = true; 
     richTextBox1.Text = StrValue ; 
} 

它是完全曾爲...

1

看起來你應該追加每次接收數據通過串口的數據,因此,或許你應該改變

indata = sp.ReadExisting(); 

到:

indata += sp.ReadExisting(); 

容納所有串行數據的內容,包括先前發送的歷史數據。

希望這有助於!

+0

我已經試過上述解決方案。在調試模式下,我可以在字符串「indata」中看到完整的數據,但是當單擊按鈕將數據顯示到richtextbox時,只顯示部分數據。 –

+0

我認爲馬修是對的。後續數據收到的事件將覆蓋以前的'indata'。當'datareceived'事件首次發生時,您不能保證已收到所有數據。 – Graham

+0

@SubhodeepBhattacharjee - 馬修是正確的,你必須連接你正在閱讀的字符串。還有一點需要注意的是,您以不安全的方式從兩個不同的線程訪問變量。 – dbasnett