我是c#的新手。
我正在使用Nucleo板通过串口将数据发送到我的GUI。数据包括脉率,步数和体温。
此处的代码可以完全正常地将所有数据显示到单个文本框中,但我希望在不同的文本框中显示每个值。
这是传入数据的样子
S0E // where "S" is for steps and "E" is for the end
P5E // where "P" is for pulse rate and "E" is for the end
T22.5E // where "T" is for body temp. and "E" is for the end
以下是我正在使用的代码:
private void showbtn_Click(object sender, EventArgs e) //Showbtn click
{
text.Clear(); //clears the text in the textbox
bool foundUser = false; // sets the boolean foundUser to false
int userindex = 0; // sets interger to zero
for (int i = 0; i < userlist.Count; i++)
{
if (userlist[i].name.Equals(Nametb.Text)) // if the user entered name equals to the name in the list
{
foundUser = true;
userindex = i;
}
}
if (foundUser == true)
{
string userText; // the following lines of code displays the user details in the textbox
userText = "name :" + userlist[userindex].name + "user :" + Environment.NewLine + "age:" + userlist[userindex].age +
Environment.NewLine + " gender:" + userlist[userindex].gender + Environment.NewLine + "height:" + userlist[userindex].height +
Environment.NewLine + "weight:" + userlist[userindex].weight + Environment.NewLine + "BMI :" + userlist[userindex].bmI;
text.Text = userText;
}
else
{
text.Text = "no user found"; // if the user not found displays as "no user Found"
}
t = comboBox1.Text.ToString();
sErial(t);
}
private void button2_Click(object sender, EventArgs e) // searches for available com ports
{
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
comboBox1.Items.Add(port); // adds them to the combo box
}
}
string t;
private SerialPort SerialPort1;
void sErial(string Port_name)
{
SerialPort1 = new SerialPort(Port_name, 9600, Parity.None, 8, StopBits.One); //serial port properties
SerialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
SerialPort1.Open(); //opens serial port
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort serialPort1 = (SerialPort)sender;
string w = serialPort1.ReadLine(); // assigns the data from the serial port to a string
if (w != String.Empty)
{
if (abort == false)
{
Invoke(new Action(() => rt1.AppendText(w))); // displays the data in a textbox
}
}
}
答案 0 :(得分:0)
如果我理解正确,您将从外部设备接收数据,并希望拆分包含由单个字符分隔的多个数字数据元素的字符串,以便您可以将结果显示到不同的文本框。
这是从嵌入式系统接收数据并需要学习如何在主机PC上处理数据的人要解决的典型问题,但对C#编程来说是新手。
有很多不同的方法可以做到这一点。既然你说你可以在一个文本框中接收和显示整个字符串,我将只关注如何将它拆分并在三个不同的richTextBox中显示这些部分。
对于c#beginner,string.split
和substring
是分解字符串的非常简单的方法。这是一个使用string.split的简单示例。
我为你做了一个完整的例子:你可以在下面看到它有效。首先,我创建了一个包含三个富文本框的表单,名为rt1,rt2和rt3,以及一个名为tbInput的输入文本框和一个名为btnSplit的按钮。
然后在设计器中,我双击按钮为btnInput_click添加一个事件处理程序,并将下面的代码添加到该处理程序中。那就是它!
private void btnSplit_Click(object sender, EventArgs e)
{
string blah = tbInput.Text;
tbInput.Clear();
var lst = blah.ToUpper().Split('E').ToList();
foreach (var item in lst)
if (item.Trim().StartsWith("S"))
rt1.AppendText($"Steps: {item.Remove(0, 1)} \n");
else if (item.Trim().StartsWith("T"))
rt2.AppendText($"Temperature: {item.Remove(0, 1)} \n");
else if (item.Trim().StartsWith("P"))
rt3.AppendText($"Pulse: {item.Remove(0, 1)} \n");
}
代码将输入转换为大写,将字符串拆分为字母&#34; E&#34;并将结果分配给一个列表,因此给定包含三个&#34; E&#34; s的起始字符串,您现在将拥有一个包含三个字符串的列表:
item01 == S111
item02 == T98.6
item03 == P70
然后我修剪前导和尾随空格,并根据前导字符将结果分配给三个RichTextBox中的一个。在将结果附加到文本框之前,我使用item.Remove(0,1)
删除前导字符。我使用插值将结果嵌入到我选择的字符串中。
我应该指出,除非您在UI线程以外的线程上运行此代码,否则您不需要使用Action委托,也不需要调用任何内容。如果您在主线程上,只需将文本附加到文本框中即可。
如果 计划对在UI上运行的控件进行跨线程调用,则Action<>
委托不是执行此操作的正确方法。如果这是您尝试做的事情,请查看MethodInvoker()
。但是,我强烈建议您不要尝试使用多个线程,直到您作为程序员非常高级,并阅读了有关该主题的几本书。对于像这样的简单项目,它们当然不需要它们:)
这有帮助吗?
答案 1 :(得分:0)
@ craig.Feied
这是我改变的部分。 再次感谢您的帮助。
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort serialPort1 = (SerialPort)sender;
var rt1 = new RichTextBox();
var rt2 = new RichTextBox();
var rt3 = new RichTextBox();
string blah = serialPort1.ReadLine();
var lst = blah.Split('E').ToList();
foreach (var item in lst)
if (item.Trim().StartsWith("S"))
rt1.AppendText($"Steps: {item.Remove(0, 1)} \n");
else if (item.Trim().StartsWith("T"))
rt2.AppendText($"Temperature: {item.Remove(0, 1)} \n");
else if (item.Trim().StartsWith("P"))
rt3.AppendText($"Pulse: {item.Remove(0, 1)} \n");
}