C#,Csharp,多串口如何后台运行,如何把数据写入数据库的问题
一个C#程序已经连接一个数据库,现在需要增加多个串口接收数据,数据要储存在数据库里,并绘制曲线,并且串口需在后台运行直到程序关闭。有没有相关实例,或者详细解决方案,本人初...
一个C#程序已经连接一个数据库,现在需要增加多个串口接收数据,数据要储存在数据库里,并绘制曲线,并且串口需在后台运行直到程序关闭。有没有相关实例,或者详细解决方案,本人初学,求解答。分不是问题!
展开
展开全部
不知道你说的串口是指的端口还是真的串口,我两个都简单的说一下吧,供你参考。
.NET 已经提供的serialPort类,封装了串口的基本操作,如果你电脑上安装的是 VISUAL SUDIO,那么你看看帮助文档就可以找到很详细的介绍,还有实例源码供参考。MSDN上也有非常详细的介绍。
关于后台监听的问题,这个可以这样实现,首先,在程序中调用serialport的open方法,先将这个串口打开,然后在串口的DataReceived事件里面编写你的处理写入数据的代码就可以了。
下面是我写的通过短信猫发送短信的部分函数,其中也有写入数据库的功能,供你参考。
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string str = "";
//PDUdecoding SendSMS = new PDUdecoding();
Thread.Sleep(200);
str = serialPort.ReadExisting();
DebugReceived(str);
if (str.Contains("+CMTI"))
{
string[] SMSSns = new string[100];
SMSSns = str.Split((char)44);
string smssn = SMSSns[1];
serialPort.Write("AT+CMGR=" + smssn + "\r");
Thread.Sleep(100);
//Tools.ShowMessage(smssn, MessageBoxIcon.Information);
}
//处理初始化命令
if (str.Contains("AT+CPMS=\"MT\",\"SM\",\"ME\"\r"))
{
Tools.Is_SerialPort_Inited = true;
}
if (str.Contains("+CMGR:") && str.Contains("OK"))
{
string[] strs = str.Split((char)10);
string SMSContent = "";
string Number = "";
string date = "";
if (strs[2].Contains("08"))
{
SMSContent = RecSMS.GetContent(strs[2]);
Number = RecSMS.GetTelphone(strs[2]);
date = RecSMS.GetDataTime(strs[2]);
DebugSMSLog("*************************************************************",Color.Black,false);
DebugSMSLog("收到新短信!\r\n", Color.Blue, true);
DebugSMSLog("内容:\r\n" + SMSContent + "\r\n发送人:" + Number + "\r\n发送时间:" + date, Color.Blue, false);
DebugSMSLog("*************************************************************\r\n", Color.Black, false);
if (SMSContent.Contains("DW+"))
{
string CarNumber = "";
string CarPW = "";
string[] CarLoactionInfo = SMSContent.Split('+');
if (CarLoactionInfo.Length > 2)
{
CarNumber = CarLoactionInfo[1];
CarPW = CarLoactionInfo[2];
Set_Info_To_Send_ToClient(Number, CarNumber, CarPW);
}
}
}
//Tools.ShowMessage("注意,收到短信!\r内容:" + SMSContent + "\r发送人:" + Number + "\r发送时间:" + date + "\r", MessageBoxIcon.Information);
}
//判断是否可以写入短信内容
if (str != "" && str.Contains("AT+CMGS=") && str.Contains(">"))
{
Tools.CanWriteSMSContentToSerialPort = true;
}
//短信发送失败
if (str != "" && str.Contains("ERROR"))
{
Tools.IsSMSSendSuccess = false;
}
//短信发送成功
if (str != "" && str.Contains("+CMGS:"))// && Tools.SendSMSBZ)
{
if (str.Contains("OK"))
{
SentSMSNumber++;
StatusSMS.Text = "已发送" + SentSMSNumber.ToString() + "条定位信息";
DebugSMSLog(System.DateTime.Now.ToString() + " 发送成功! ",Color.Green,true);
DebugSMSLog("##############################################################", Color.Black,false);
StatusSMS.ForeColor = Color.Green;
Tools.IsSMSSendSuccess = true;
}
if (str.Contains("ERROR"))
{
DebugSMSLog(System.DateTime.Now.ToString() + " 请注意:该条短信发送失败! ",Color.Red,true);
DebugSMSLog("##############################################################", Color.Black,false);
}
}
}
catch
{
}
}
请注意,DataReceived事件默认异步处理的,也就是说,该事件中的处理代码和主线程不一样的,如果涉及到在该事件中要更新界面或跨线程访问窗口控件的话,则要采用委托的方式,具体方法可以参考多线程编程。
好久没来百度知道了,为了你这个问题,我还把我以前做的CS程序打开详细研究了一番,希望能够抛砖引玉,对你有所帮助。
.NET 已经提供的serialPort类,封装了串口的基本操作,如果你电脑上安装的是 VISUAL SUDIO,那么你看看帮助文档就可以找到很详细的介绍,还有实例源码供参考。MSDN上也有非常详细的介绍。
关于后台监听的问题,这个可以这样实现,首先,在程序中调用serialport的open方法,先将这个串口打开,然后在串口的DataReceived事件里面编写你的处理写入数据的代码就可以了。
下面是我写的通过短信猫发送短信的部分函数,其中也有写入数据库的功能,供你参考。
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string str = "";
//PDUdecoding SendSMS = new PDUdecoding();
Thread.Sleep(200);
str = serialPort.ReadExisting();
DebugReceived(str);
if (str.Contains("+CMTI"))
{
string[] SMSSns = new string[100];
SMSSns = str.Split((char)44);
string smssn = SMSSns[1];
serialPort.Write("AT+CMGR=" + smssn + "\r");
Thread.Sleep(100);
//Tools.ShowMessage(smssn, MessageBoxIcon.Information);
}
//处理初始化命令
if (str.Contains("AT+CPMS=\"MT\",\"SM\",\"ME\"\r"))
{
Tools.Is_SerialPort_Inited = true;
}
if (str.Contains("+CMGR:") && str.Contains("OK"))
{
string[] strs = str.Split((char)10);
string SMSContent = "";
string Number = "";
string date = "";
if (strs[2].Contains("08"))
{
SMSContent = RecSMS.GetContent(strs[2]);
Number = RecSMS.GetTelphone(strs[2]);
date = RecSMS.GetDataTime(strs[2]);
DebugSMSLog("*************************************************************",Color.Black,false);
DebugSMSLog("收到新短信!\r\n", Color.Blue, true);
DebugSMSLog("内容:\r\n" + SMSContent + "\r\n发送人:" + Number + "\r\n发送时间:" + date, Color.Blue, false);
DebugSMSLog("*************************************************************\r\n", Color.Black, false);
if (SMSContent.Contains("DW+"))
{
string CarNumber = "";
string CarPW = "";
string[] CarLoactionInfo = SMSContent.Split('+');
if (CarLoactionInfo.Length > 2)
{
CarNumber = CarLoactionInfo[1];
CarPW = CarLoactionInfo[2];
Set_Info_To_Send_ToClient(Number, CarNumber, CarPW);
}
}
}
//Tools.ShowMessage("注意,收到短信!\r内容:" + SMSContent + "\r发送人:" + Number + "\r发送时间:" + date + "\r", MessageBoxIcon.Information);
}
//判断是否可以写入短信内容
if (str != "" && str.Contains("AT+CMGS=") && str.Contains(">"))
{
Tools.CanWriteSMSContentToSerialPort = true;
}
//短信发送失败
if (str != "" && str.Contains("ERROR"))
{
Tools.IsSMSSendSuccess = false;
}
//短信发送成功
if (str != "" && str.Contains("+CMGS:"))// && Tools.SendSMSBZ)
{
if (str.Contains("OK"))
{
SentSMSNumber++;
StatusSMS.Text = "已发送" + SentSMSNumber.ToString() + "条定位信息";
DebugSMSLog(System.DateTime.Now.ToString() + " 发送成功! ",Color.Green,true);
DebugSMSLog("##############################################################", Color.Black,false);
StatusSMS.ForeColor = Color.Green;
Tools.IsSMSSendSuccess = true;
}
if (str.Contains("ERROR"))
{
DebugSMSLog(System.DateTime.Now.ToString() + " 请注意:该条短信发送失败! ",Color.Red,true);
DebugSMSLog("##############################################################", Color.Black,false);
}
}
}
catch
{
}
}
请注意,DataReceived事件默认异步处理的,也就是说,该事件中的处理代码和主线程不一样的,如果涉及到在该事件中要更新界面或跨线程访问窗口控件的话,则要采用委托的方式,具体方法可以参考多线程编程。
好久没来百度知道了,为了你这个问题,我还把我以前做的CS程序打开详细研究了一番,希望能够抛砖引玉,对你有所帮助。
展开全部
接收数据是定时轮询还是被动接收?接收方式不一样,处理方式也不一样。
如果是定时轮询的话,建议你找个开源的串口操作类库。
如果是被动接收的话,建议使用vs自带的 serialPort 类。
如果是定时轮询的话,建议你找个开源的串口操作类库。
如果是被动接收的话,建议使用vs自带的 serialPort 类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我写过有6个串口同时通信的程序,只要在
DataReceived
事件中获取到数据然后进行数据库处理。
给你一个获取串口数据的方法
private string GetUnlockData(SerialPort serialPort)
{
string orderNum;
char[] orderNumChar = new char[30];
if (this.GetPartNo(serialPort) != this._partNo)
return string.Empty;
serialPort.Read(orderNumChar, 0, orderNumChar.Count());
orderNum = this.ConverLeterCharArrayTOString(orderNumChar); //将从COM口读到的字符数组转换为字符口串
return orderNum;
}
DataReceived
事件中获取到数据然后进行数据库处理。
给你一个获取串口数据的方法
private string GetUnlockData(SerialPort serialPort)
{
string orderNum;
char[] orderNumChar = new char[30];
if (this.GetPartNo(serialPort) != this._partNo)
return string.Empty;
serialPort.Read(orderNumChar, 0, orderNumChar.Count());
orderNum = this.ConverLeterCharArrayTOString(orderNumChar); //将从COM口读到的字符数组转换为字符口串
return orderNum;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主确定你说的是串口?串口是COM硬件口啊
楼主你说的是不是线程啊?
楼主你说的是不是线程啊?
追问
确认是串口 多个串口 描绘不同的曲线
串口的数据需要存储在数据库里 需要时可查询
我现在就用的serialPort类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-06-04
展开全部
本人才刚学C#,这个还没学到,等学到时再告诉你哈,,,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |