private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = serialPort2.BytesToRead;
byte[] buf = new byte[16];//宣告一個臨時陣列存盤當前來的串口資料
serialPort2.Read(buf, 0, n);//讀取緩沖資料
builder.Clear();//清除字串構造器的內容
//因為要訪問ui資源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//判斷是否是顯示為16進制
//直接按ASCII規則轉換成字串
builder.Append(Encoding.ASCII.GetString(buf));
//追加的形式添加到文本框末端,并滾動到最后。
this.txtSendData.AppendText(builder.ToString());
}));
}
現在是每次接收的資料都會疊加顯示在textbox里面,怎么才能只顯示最新的資料呢
uj5u.com熱心網友回復:
AppendText就是疊加的啊。不疊加你用Textuj5u.com熱心網友回復:
this.txtSendData.Text=builder.ToString();
直接這樣寫嗎,這樣寫textbox沒有資料啊
uj5u.com熱心網友回復:
除錯看builder有沒有值uj5u.com熱心網友回復:
builder是有值的
uj5u.com熱心網友回復:
這樣寫沒問題的自己可以試試this.txtSendData.Text="123";你要學會用F11,一步步來不要急,自己學會找問題
uj5u.com熱心網友回復:
你要把收到的資料 轉成16進制的,如果是直接收到的欄位toString()的話,有可能會收失位元組是0,轉成String就是截斷符。uj5u.com熱心網友回復:
//設定游標的位置到文本尾
txtSendData.Select(txtSendData.TextLength, 0);
//滾動到控制元件游標處
txtSendData.ScrollToCaret();
試試看
uj5u.com熱心網友回復:
我的意思是說,我獲取到最新的值后,前面的值不顯示了,只顯示一行資料
uj5u.com熱心網友回復:
那你獲得最新的值后,直接賦給那個顯示控制元件唄,就不要追加了。
uj5u.com熱心網友回復:
this.txtSendData.Text=builder.ToString();這樣寫沒有資料this.txtSendData.AppendText(builder.ToString());這樣寫有資料
那么是不是可以想一個折中的辦法:
先this.txtSendData.Text = “”;把之前的資料清空
再 this.txtSendData.AppendText(builder.ToString());
uj5u.com熱心網友回復:
我這樣試過不行,還是沒有資料哎
uj5u.com熱心網友回復:
直接賦給Text沒有資料
uj5u.com熱心網友回復:
在這個函式的最后,加上
serialPort2.DiscardInBuffer();
試試。
uj5u.com熱心網友回復:
在serialPort2.Read(buf, 0, n); 這一行代碼的后面,加上:sp1.DiscardInBuffer();
另外,你接收到的資料是16進制嗎,轉成UTF-8格式試試?
this.txtSendData.Text = new UTF8Encoding().GetString(buf);
uj5u.com熱心網友回復:
this.txtSendData.Text=builder.ToString();這樣看不到資料的話,敢問你一般資料是什么內容?會不會有空白符號導致顯示不出來?
你要一行的資料,干嘛不直接用
String s = serialPort2.ReadLine();
這樣子獲得的就是一行的資料,不需要在轉換字符
uj5u.com熱心網友回復:
除錯看builder有沒有值uj5u.com熱心網友回復:
除錯看builder有沒有值uj5u.com熱心網友回復:
builder是如何定義的?接收的資料想顯示出來,要轉成16進制
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/155245.html
標籤:C#
