上位机,从广义的角度来说,一切可以和下位机进行通信的HMI都可以称作为上位机,从狭义的角度来说,是指采用计算机高级语言编写的上层监控系统,这里常用的编程语言包括C++、JAVA、Python、C#,毋庸置疑,在工控行业,最适合工控上位机开发的编程语言莫过于微软旗下的C#语言。
下面是我用C#语言编写的一个上位机模板(课堂上跟老师学习的)
一、界面展示
二,代码展示
1、 MainForm : Form下的定义和代码
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 系统dll导入ini写函数
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); // 系统dll导入ini读函数
string FileName = System.AppDomain.CurrentDomain.BaseDirectory + "Backup.ini"; // ini 文件名
StringBuilder BackupBuf = new StringBuilder(50);//存储读出ini内容变量
private bool isRxShow = true;
private string strRead;
2、主界面的代码
private void MainForm_Load(object sender, EventArgs e)
{
SerialPortInit();
chbCheckCRC.Enabled = false;
// 恢复发送栏
GetPrivateProfileString("串口1", "发送栏", "", BackupBuf, 50, FileName);
txtSendInfo.Text = BackupBuf.ToString();
}
public MainForm()
{
InitializeComponent();
serialPort1.Encoding = Encoding.GetEncoding("GB2312"); //支持汉字
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
3、 private void SerialPortInit()的代码
private void SerialPortInit()
{
RefreshSerialportList(cmbSerialPort);
string[] baudRates = { "4800", "9600", "115200" };
cmbBaudRate.Items.AddRange(baudRates);
cmbBaudRate.SelectedIndex = 1;
string[] dataBits = { "5", "6", "7", "8" };
cmbDataBits.Items.AddRange(dataBits);
cmbDataBits.SelectedIndex = 3;
string[] stopBits = { "One", "OnePointFive", "Two" };
cmbStopBits.Items.AddRange(stopBits);
cmbStopBits.SelectedIndex = 0;
string[] parity = { "None", "Even", "Odd", "Mark", "Space" };
cmbParity.Items.AddRange(parity);
cmbParity.SelectedIndex = 0;
}
由于代码太多我就不一一说明了,有什么大家自己开代码就知道了
private void AppendTextToInfoBox(string text, TextBox textBox)
{
textBox.AppendText(text);
}
private void RefreshSerialportList(ComboBox comboBox)
{
// 本地设备注册表中获取串口列表: 枚举计算机上可用的串口
RegistryKey keyCom = Registry.LocalMachine.OpenSubKey(@"Hardware\DeviceMap\SerialComm");
string[] sSubKeys = keyCom.GetValueNames();
string BackupPort;
// 恢复串口号
GetPrivateProfileString("串口1", "端口号", "", BackupBuf, 50, FileName);
BackupPort = BackupBuf.ToString();
comboBox.Items.Clear(); // 清空串口列表
// 添加端口号
foreach (var sValue in sSubKeys)
{
try
{
string portName = (string)keyCom.GetValue(sValue);
comboBox.Items.Add(portName);
//检测备份端口号是否有效,端口号初始化为备份端口号
if (BackupPort == portName)
{
comboBox.Text = BackupPort;
}
//如果备份端口号无效,端口号初始化为第一个可用端口号
if (comboBox.Text == "")
comboBox.Text = portName;
}
catch
{
}
}
// 设置默认显示的串口号
if (cmbSerialPort.Items.Count > 0)
{
comboBox.SelectedIndex = 0;
}
// 没有可用端口号时进行提示
else
{
AppendTextToInfoBox("[" + DateTime.Now.ToString("HH:mm;ss") + "]" + "-> ", txtRecvInfo);
AppendTextToInfoBox("没检测到可用串口!\r\n", txtRecvInfo);
}
//备份端口号
WritePrivateProfileString("串口1", "端口号", comboBox.Text, FileName);
}
扫描串口按键的代码
private void btnRefreshSerialPor_Click(object sender, EventArgs e)
{
// 先关闭串口
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
btnOpenOrClose.Text = "打开串口";
AppendTextToInfoBox("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->", txtRecvInfo);
AppendTextToInfoBox("扫描和添加串口时,关闭串口。\r\n", txtRecvInfo);
}
// 再扫描添加串口
RefreshSerialportList(cmbSerialPort);
}
打开串口按键的代码
private void btnOpenOrClose_Cl