上位机工程师入门(一)
提示:实习生学习日记,记录了在当上位机实习生的学习过程
一、利用C#编写串口助手
1.控件的布置
(1)设置serialPort控件
进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。串口属性主要包括
.PortName 串口名称,COM1, COM2等。
.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity 奇偶校验。可以选取枚举Parity中的值
.DataBits 数据位
.StopBits 停止位,可以选取枚举StopBits中的值
.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值
(2)设置time控件
用于背景进程中。通过引发Timer事件,Timer控件可以有规律的隔一段时间执行一次代码。也就是,你可以根据你自己的需要,给Timer控件设置时间,Timer每隔这段时间,就执行一次代码(这个代码你可以根据自己需要的功能写。)
Timer控件主要会用到2个属性一个是Enabled和Interval
Enabled主要是控制当前Timer控件是否可用
timer1.Enabled=false;不可用
timer1.Enabled=true;可
timer1.Interval=1000;主要是设置timer2_Tick事件的时间,单位为毫秒. 1秒=1000毫秒
(3)设置textbox控件
用于显示接收的数据文本框控件
2.向串口发送数据
利用serialPort和timer控件向串口发送数据timer负责设置循环向串口发送数据的时钟实现定时向串口发送特定数据的功能,serialPort控件负责设置串口属性与实现串口通讯。代码如下:
private void timer1_Tick(object sender, EventArgs e)
{
if (DateTime.Now.Second > 58 || DateTime.Now.Second < 2)
{
return;
}
if (serialPort1.IsOpen == false)
{
return;
}
serialport1buf.Clear();
byte[] bte;
if (ntime == 0)
{
bte = new byte[] {
0x01, 0x04, 0x00, 0x00, 0x00, 0x08, 0xf1, 0xcc };
serialport1buf.Clear();
serialPort1.Write(bte, 0, bte.Length);//向串口写入数据
}
if (ntime == 1)
{
bte = new byte[] {
0x01, 0x04, 0x00, 0x00, 0x00, 0x08, 0xf1, 0xff };
serialport1buf.Clear();
serialPort1.Write(bte, 0, bte.Length);
}
3.串口接收数据并处理
串口连接模拟量模块当模拟量模块接收到数据时会向串口应答数据,利用serialPort控件的 serialPort1.Read读取数据。并保存到数组中因为串口接收的数据中有想要处理的数据所以进行了提取与运算,因为连接的模拟量模块有八路并连接了两个所以要用两次循环接收不同模拟量模块的数据,最后利用textbox控件显示出来。代码如下:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(100); //延时100ms等待接收完数据
//this.Invoke就是跨线程访问ui的方法,也是文本的范例
int c = serialPort1.BytesToRead;
byte[] buf = new byte[c];
serialPort1.Read(buf, 0, c);//串口读取接收数据
serialport1buf.AddRange(buf);
byte[] serialport1tmp = serialport1buf.ToArray();
{
int i = jqp.byteArrayIndexOf(serialport1tmp, new byte[] {
0x01, 0x04, 0x10 }, 0);
if (i == 0)
{
try
{
if (serialport1tmp.Length >= i + 21)
{
if (ntime == 0)
{
for (int j = 0; j < 8; j++)
{
if (j == 0)
{
int vh = serialport1tmp[3 + 2 * j];
int vl = serialport1tmp[3 + 2 * j + 1];
vh |= vl;
float a = ((vh * 16 * 1000) / 4095);
// g_comValue[0] = (vh ).ToString();
float tmpfloat = ( (vh * 16*1000)/4095)*0.001F + 4;//接收数据的计算
g_comValue[0] = tmpfloat.ToString();//转换类型
textBox1.Text = g_comValue[0] ; //求得数据的显示
}
if (j ==1)
{
int vh = serialport1tmp[3 + 2 * j];
int vl = serialport1tmp[3 + 2 * j + 1];
vh <<= 8;
vh |= vl;
float tmpfloat = ((vh * 16 * 1000) / 4095) * 0.01F + 4;
g_comValue[1] = tmpfloat.ToString();
textBox1.Text += g_comValue[1];
}
if (j == 2)
{
int vh = serialport1tmp[3 + 2 * j];
int vl = serialport1tmp[3 + 2 * j + 1];
vh <<= 8;
vh |= vl;
float tmpfloat = ((vh * 16 * 1000) / 4095) * 0.01F + 4;
g_comValue[2] = tmpfloat.ToString();
textBox1.Text += g_comValue[3];
}
if (j == 3)
{
int vh = serialport1tmp[3 + 2 * j];
int vl = serialport1tmp[3 + 2 * j + 1];
vh <<= 8;
vh |= vl;
float tmpfloat = ((vh * 16 * 1000) / 4095) * 0.01F + 4;
g_comValue[3] = tmpfloat.ToString();
textBox1.Text += g_comValue[4];
}
if (j == 4)
{
int vh = serialport1tmp