[英]Read a serialport in real time
我正在嘗試執行控制,以接收Arduino發送的信息。
此信息的類型為字符串,格式為VX 1.987或VY 0.123,並以高速發送。 在對它們進行過濾和處理之后,它們將更新程序中的文本框,這樣,我在文本框中看到的就是收到的最后一條信息。
我的代碼發生的事情是,例如,在某個時刻,Arduino發送了1000行,我的程序將更新到600行,然后停止顯示更新。 我知道在接收緩沖區中還有其他400行,但未顯示。 總結如何使備忘錄時間通過串行接收信息並讀入文本框? 這可能是處理時間問題嗎? 怎么解決?
namespace ControleCaseiro
{
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
DataIn = serialPort1.ReadLine();
this.Invoke(new EventHandler(MostraDados));
}
catch(Exception ex)
{ }
}
private void MostraDados(object sender, EventArgs e)
{
switch (DataIn)
{
case "19\r":
textcontrole.Text = "XOFF";
break;
case "17\r":
textcontrole.Text = "XON";
if (botãoEnviaGcode)
{
LinhaArquivo++;
EnviaGcode();
}
break;
default:
FiltroDadosRecebidos(DataIn);
break;
}
}
private void FiltroDadosRecebidos(string valorRecebido)
{
string eixo="";
int tamanho=0;
string valorEixoAtual="";
if (valorRecebido.Length > 1)
{
tamanho = valorRecebido.Length;
eixo = valorRecebido.Substring(0, 2);
switch (eixo)
{
case "VX":
valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
txtPosAtualX.Text=valorEixoAtual;
break;
case "VY":
valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
txtPosAtualY.Text=valorEixoAtual;
break;
case "VZ":
valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
txtPosAtualZ.Text=valorEixoAtual;
break;
default :
DadosRecebidos.Items.Add(DataIn);// se não for dados referentes aos eixos, vai mostrar na listbox “DadosRecebidos”
break;
}
}
}
}
正如我在開始時已經描述的那樣,Arduino正在發送信息是什么,過一會兒,所有信息發送到該信息,而信息未顯示在TextBox中。 看起來是在OA SerialPort接收數據時,事件“ SerialDataReceivedEventArgs”使程序顯示該信息,當接收到該信息時,不再顯示該信息,並且該信息會累積在串行端口緩沖區中。
問題可能是您沒有處理接收緩沖區中的所有數據。 即使可能有多行等待處理,您也只提取了一行接收緩沖區。 您可以嘗試將處理程序更改為以下形式:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
while (serialPort1.BytesToRead > 0)
{
DataIn = serialPort1.ReadLine();
this.Invoke(new EventHandler(MostraDados));
}
}
catch (Exception ex)
{ }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.