我正在尝试用 C# 编写一个简单的程序,该程序将从通过串行连接的 Arduino 读取数据输出,将相关数据从经过格式化的文本字符串中提取出来,以便在串行监视器中易于理解,显示两部分两个只读文本框中的信息作为计数器(每次更新信息时覆盖),并使用这些数字更新 SQL 表。
例子:
Arduino输出:
'Day Users: 234231'
'All Users: 433241'
C# 在 textbox1 中显示完整消息
C# 在 textbox2 中显示 234231
C# 在 textbox3 中显示 433241
C# UPDATES SQL 表的内容如下:
SqlCommand myCommand = new SqlCommand("UPDATE USER_NUMBERS
SET NUMBERZ= 234231
WHERE UPTIME = DAYHK");
但显然,'234231' 是一个变量,由 Arduino 的输入指定,然后通知 textbox2 的内容和更新 SQL 表所需的值。
我对 C# 很陌生,但到目前为止,我有一个程序可以从 Arduino 读取串行数据并将整个输出放入 textbox1,但仅此而已。
如何指定要分配给值的输入数据的一部分作为 textbox2(或 textbox3)中的文本输出,然后使用它来执行此操作以及更新我的 SQL 表中保存的值?
到目前为止,我的代码是这样的:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Serial_Reader
{
public partial class Form1 : Form
{
string RxString;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Open();
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
buttonSQL.Enabled = true;
textBox1.ReadOnly = false;
}
}
private void buttonStop_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
buttonStart.Enabled = true;
buttonStop.Enabled = false;
buttonSQL.Enabled = false;
textBox1.ReadOnly = true;
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// If the port is closed, don't try to send a character.
if (!serialPort1.IsOpen) return;
// If the port is Open, declare a char[] array with one element.
char[] buff = new char[1];
// Load element 0 with the key character.
buff[0] = e.KeyChar;
// Send the one character buffer.
serialPort1.Write(buff, 0, 1);
// Set the KeyPress event as handled so the character won't
// display locally. If you want it to display, omit the next line.
e.Handled = true;
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) serialPort1.Close();
}
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
}
private void buttonSQL_Click(object sender, EventArgs e)
{
}
}
}
正如你从“我的”熟练评论中看到的,但编程不熟练,我使用的是来自精彩教程的代码:我的程序将有一个额外的按钮来开始 SQL 通信,当串行通信停止时停止,和两个额外的文本框。
编辑:
输入格式为:
Someone got up from seat number 9
All-time users on seat number 9 is: 5
Today's total users: 17
All-time total users: 17
这样非程序员检查串行监视器可以很容易地理解输出。第一行总是“Someone got up from”或“Someone sated on”,在第二行,只有数字发生变化,第三行和第四行也是如此,但第三和第四行的数字(在这种情况相同,因为系统运行不到一天)是需要解析的。
编辑 2(新代码):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Serial_Reader
{
public partial class Form1 : Form
{
string RxString;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Open();
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
buttonSQL.Enabled = true;
textBox1.ReadOnly = true;
}
}
private void buttonStop_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
buttonStart.Enabled = true;
buttonStop.Enabled = false;
buttonSQL.Enabled = false;
textBox1.ReadOnly = true;
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// If the port is closed, don't try to send a character.
if (!serialPort1.IsOpen) return;
// If the port is Open, declare a char[] array with one element.
char[] buff = new char[1];
// Load element 0 with the key character.
buff[0] = e.KeyChar;
// Send the one character buffer.
serialPort1.Write(buff, 0, 1);
// Set the KeyPress event as handled so the character won't
// display locally. If you want it to display, omit the next line.
e.Handled = true;
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) serialPort1.Close();
}
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
}
private void buttonSQL_Click(object sender, EventArgs e)
{
// SqlConnection myConnection = new SqlConnection("user id=username;" +
// "password=password;server=serverurl;" +
// "Trusted_Connection=yes;" +
// "database=database; " +
// "connection timeout=30");
do
{
string dayUsers, allUsers;
string s1 = "Today's total users: ";
string s2 = "All-time total users: ";
if (RxString.Contains(s1))
{
dayUsers = RxString.Replace(s1, "");
textDU.Text = dayUsers;
// string queryDay = "UPDATE USER_NUMBERS SET NUMBERZ=" + dayUsers + "WHERE UPTIME=DAYHK";
}
if (RxString.Contains(s2))
{
allUsers = RxString.Replace(s2, "");
textAU.Text = allUsers;
// string queryAll = "UPDATE USER_NUMBERS SET NUMBERZ=" + allUsers + "WHERE UPTIME=ALLHK";
}
}
while (serialPort1.IsOpen);
}
private void textDU_TextChanged(object sender, EventArgs e)
{
}
private void textAU_TextChanged(object sender, EventArgs e)
{
}
}
}
编辑 3(传入数据):
if (abs (then [i] - now[i]) > THRESH)
{
Serial.print ("Someone ");
if (now [i] > then [i])
{
Serial.print ("sat on");
allusers++;
dayusers++;
digitalWrite(counterPin, HIGH); // hit counter
delay(75);
digitalWrite(counterPin, LOW);
val[i]++;
}
else
{
Serial.print ("got up from");
}
Serial.print (" seat number ");
Serial.println (i);
Serial.print ("All-time users on seat number ");
Serial.print (i);
Serial.print (" is: ");
Serial.println (val[i]);
Serial.print ("Today's total users: ");
Serial.println (dayusers);
Serial.print ("All-time total users: ");
Serial.println (allusers);
}