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

C#,Csharp,多串口如何后台运行,如何把数据写入数据库?,第1张

我写过有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

}

不知道你说的串口是指的端口还是真的串口,我两个都简单的说一下吧,供你参考。

.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程序打开详细研究了一番,希望能够抛砖引玉,对你有所帮助。

数值是没有必要分几进制的,它在内存中就是二进制保存的。只是为了方便人们查看,可以转为n进制的格式显示在文本框中进行显示的。

所以

1 buf 就不要转为字符串了,直接以二进制格式存入数据库。下次也是以二进制的形式取出(就是byte[])

2 richTextBox1 要显示二进制也好,16进制也好 根据实际需要决定。象你上面的例子,builder 中的内容直接插入到richTextBox1中就好了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9951108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存