using System;
using System.Collections.Generic;
using System.ComponentModel; //引用C#系统中各种类,
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; //引用C#系统中各种类调用类
using System.IO.Ports;
using System.Threading;
using Microsoft.Win32;
using System.Data.SqlClient;
//*******************蓝色字迹的代码都是C#已经编辑好的类*****************************
namespace testArdono //namespace关键字用于声明一个范围。此命名空间范围允许您组织代码并为您提供了创建全局唯一类型的方法:
{
public partial class Form1 : Form
{
//第二步,初始化组件。此为构造函数
public Form1() //在Program中右键单击一下最后一行的Form1,选择转到定义,就到这一步了,也就是第二步。
{
InitializeComponent(); //初始化控件
}
private SerialPort Sp = new SerialPort();//获取串口的C#的类 。SerialPort : Component,串口类继承与组件类,sp为对象名,代表串口,以后的程序中都是用这个代表串口
public delegate void HandleInterfaceUpdataDelegate(string text); //委托,此为重点。授权串口手动更新
private HandleInterfaceUpdataDelegate interfaceUpdataHandle;//实例化对象
SqlConnection conn;//实例化数据库连接,也就是连接数据库 SqlConnection这是类,conn是实例化的对象
SqlCommand comm;//执行数据库命令 同上
SqlDataReader sdr; //执行数据读取, SqlDataReader为类,sdr为实例化对象,在后面的代码中就是将这些对象应用
string strSQL = "";//字符串类型 来定义strSQL函数
private void Form1_Load(object sender, EventArgs e)
{
//第五步,打开数据库
conn = new SqlConnection("server=.;uid=sa;pwd=123;database=testArduino");
conn.Open();
//获取串口号
GetComList();
//初始化总窗体时先把暂停按钮默认为NO
btPause.Enabled = false;
cmRate.Text = "9600";
}
private void btnStart_Click(object sender, EventArgs e)
{
interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象
Sp.PortName = cmID.Text.Trim();//如果写进去的数后面有空格,Trim自动将空格消除
Sp.BaudRate = Convert.ToInt32(cmRate.Text.Trim());
Sp.Parity = Parity.None;
Sp.StopBits = StopBits.One;
Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
Sp.ReceivedBytesThreshold = 1;
try
{
Sp.Open();
ATCommand3("AT+CLIP=1\r", "OK");
btnStart.Enabled = false;
btPause.Enabled = true;
}
catch
{
MessageBox.Show("端口" + cmID.Text.Trim() + "打开失败!");
}
}
private void btPause_Click(object sender, EventArgs e)
{
Sp.Close();
btnStart.Enabled = true;
btPause.Enabled = false;
}
//*******************核心算法*****************************
public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string strTemp = "";
double iSecond = 1;
DateTime dtOld = System.DateTime.Now;
DateTime dtNow = System.DateTime.Now;
TimeSpan dtInter;
dtInter = dtNow - dtOld;
int i = Sp.BytesToRead;
if (i > 0)
{
try
{
strTemp = Sp.ReadExisting();
}
catch
{ }
if (strTemp.ToLower().IndexOf("\r") < 0)
{
i = 0;
}
else
{
this.Invoke(interfaceUpdataHandle, strTemp);
}
}
while (dtInter.TotalSeconds < iSecond && i <= 0)
{
dtNow = System.DateTime.Now;
dtInter = dtNow - dtOld;
i = Sp.BytesToRead;
if (i > 0)
{
try
{
strTemp += Sp.ReadExisting();
}
catch
{ }
if (strTemp.ToLower().IndexOf("\r") < 0)
{
i = 0;
}
else
{
this.Invoke(interfaceUpdataHandle, strTemp);
}
}
}
}
// 执行AT指令并返回 成功失败
private void ATCommand3(string ATCmd, string StCmd)
{
string response = "";
response = ATCommand(ATCmd, StCmd);
}
private string ATCommand(string ATCmd, string StCmd)
{
string response = "";
int i;
if (!ATCmd.EndsWith("\x01a"))
{
if (!(ATCmd.EndsWith("\r") || ATCmd.EndsWith("\r\n")))
{
ATCmd = ATCmd + "\r";
}
}
Sp.WriteLine(ATCmd);
//第一次读响应数据
if (Sp.BytesToRead > 0)
{
response = Sp.ReadExisting();
//去除前端多可能多读取的字符
if (response.IndexOf(ATCmd) > 0)
{
response = response.Substring(response.IndexOf(ATCmd));
}
else
{
}
if (response == "" || response.IndexOf(StCmd) < 0)
{
if (response != "")
{
if (response.Trim() == "ERROR")
{
//throw vError = new UnknowException("Unknown exception in sending command:" + ATCmd);
}
if (response.IndexOf("+CMS ERROR") >= 0)
{
string[] cols = new string[100];
cols = response.Split(';');
if (cols.Length > 1)
{
string errorCode = cols[1];
}
}
}
}
}
//读第一次没有读完的响应数据,直到读到特征数据或超时
for (i = 0; i < 3; i++)
{
Thread.Sleep(1000);
response = response + Sp.ReadExisting();
if (response.IndexOf(StCmd) >= 0)
{
break;
}
}
return response;
}
private void GetComList()
{
RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
if (keyCom != null)
{
string[] sSubKeys = keyCom.GetValueNames();
this.cmID.Items.Clear();
foreach (string sName in sSubKeys)
{
string sValue = (string)keyCom.GetValue(sName);
this.cmID.Items.Add(sValue);
}
}
}
private void cmID_DropDown(object sender, EventArgs e)
{
GetComList();
}
private void UpdateTextBox(string text)
{
tbData.Text = text;
string[] strs = text.Split(',');
//SQL语句
strSQL = "insert into Arduino(Time,XAxis,YAxis,ZAxis,TotalMagnetic) values ('" + float.Parse(strs[0]) + "','" + float.Parse(strs[1]) + "','" + float.Parse(strs[2]) + "','" + float.Parse(strs[3]) + "','" + float.Parse(strs[4]) + "')";
//执行SQL语句
comm = new SqlCommand(strSQL, conn);
sdr = comm.ExecuteReader();
sdr.Close();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Sp.Close();
}
}
}
我在资源中上传了源程序,有参考的可以下载