C#,Csharp,多串口如何后台运行,如何把数据写入数据库的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#,Csharp,多串口如何后台运行,如何把数据写入数据库的问题相关的知识,希望对你有一定的参考价值。

一个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程序打开详细研究了一番,希望能够抛砖引玉,对你有所帮助。
参考技术A 接收数据是定时轮询还是被动接收?接收方式不一样,处理方式也不一样。
如果是定时轮询的话,建议你找个开源的串口操作类库。
如果是被动接收的话,建议使用vs自带的 serialPort 类。
参考技术B 我写过有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;
参考技术C 楼主确定你说的是串口?串口是COM硬件口啊
楼主你说的是不是线程啊?追问

确认是串口 多个串口 描绘不同的曲线
串口的数据需要存储在数据库里 需要时可查询
我现在就用的serialPort类。

参考技术D 本人才刚学C#,这个还没学到,等学到时再告诉你哈,,,

以上是关于C#,Csharp,多串口如何后台运行,如何把数据写入数据库的问题的主要内容,如果未能解决你的问题,请参考以下文章

c#从串口读取数据怎样读一个就清空缓存

C#多线程如何处理数据

c# 如何把字符串转化为代码!

如何使用C# 进行串口的读写,请详细点

c#如何实现串口通信读取数据

c#如何获取串口的句柄?