C#读多串口,本人已经可以读6个串口,但是写入数据库时遇到了问题

.Net技术 码拜 4年前 (2016-02-26) 713次浏览
本人在主线程中已经同时读了读取了6个串口信息。现在怎么写输入数据库呢?本人在每一个接收事件中尝试写入数据库,写一个串口没有问题,但是同时写两个时就出差哦。
private void 启动系统ToolStripMenuItem_Click(object sender, EventArgs e)
{
//点亮系统运行图标
toolStripButton1.Image = imageList1.Images[0];
//打开串口
JZ_RecePort1.openPort();
JZ_RecePort2.openPort();
JZ_RecePort3.openPort();
JZ_RecePort4.openPort();
LG_RecePort1.openPort();
LG_RecePort2.openPort();
// 接收响应时间
JZ_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort1_DataReceived_JZ);
JZ_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort2_DataReceived_JZ);
JZ_RecePort3.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort3_DataReceived_JZ);
JZ_RecePort4.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort4_DataReceived_JZ);
LG_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort1_DataReceived_LG);
LG_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort2_DataReceived_LG);
}
// 串口COM1–COM6接收数据
public void JZ_RecePort1_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[0]= utility.ByteArrayToBinaryString(bits);
//写入数据库语句,放在数据库操作类中了
}
public void JZ_RecePort2_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[1] = utility.ByteArrayToBinaryString(bits);

}
public void JZ_RecePort3_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[2] = utility.ByteArrayToBinaryString(bits);

}
public void JZ_RecePort4_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[3] = utility.ByteArrayToBinaryString(bits);

}
public void LG_RecePort1_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[4] = utility.ByteArrayToBinaryString(bits);
}
public void LG_RecePort2_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
Com_Receive[5] = utility.ByteArrayToBinaryString(bits);
}   // 串口COM1–COM6接收数据
高手指定一下!

解决方案

30

1.工控程序需要对多线程进行处理
2.像JZ_RecePort1_DataReceived_JZ这些函数实际上是在后台线程中执行的
3.在后台线程中不要进行访问数据库这样的耗时操作,收到数据后,先写入缓存(就是变量)里面
4.前台线程中,启动一个Timer,,每隔一段时间去读一次缓存
注意:写和读缓存的时候,要用Monitor.Enter和Monitor.Exit同步

30

给你个例子吧,根据本人需要改一下
public class COM
{
private SerialPort sp;
private string val = “”;
public COM(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity)
{
sp = new SerialPort();
sp.PortName = portName;
sp.BaudRate = baudRate;
sp.DataBits = dataBits;
sp.StopBits = stopBits;
sp.Parity = parity;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
public void open()
{
try
{
sp.Open();
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
}
public void close()
{
if (sp != null && sp.IsOpen) sp.Close();
}
public string getValue()
{
string v;
Monitor.Enter(this);
v = string.Copy(val);
Monitor.Exit(this);
return v;
}
public void setValue(string v)
{
Monitor.Enter(this);
val = string.Copy(v);
Monitor.Exit(this);
}
public void send(string v)
{
try
{
sp.Write(v);
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
}
private void sp_DataReceived(System.Object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread.Sleep(100); //延时等待数据接收完毕
try
{
string str = sp.ReadExisting();
setValue(str);
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
}
}

20

先把逻辑捋清楚了,再写代码.
从你乱糟糟的代码里,根本看不清楚到底想干嘛
6组数据分别放到不同的地方,这个地方就要首先保证不能有交叉覆盖
前面Com_Receive[1] = utility.ByteArrayToBinaryString(bits);这是闹哪样,看后面Com_Receive明显是个一维数组,每组数据就只有1个字节???你这不是从1开始,把串口1的数据都覆盖了
然后6组数据应该分别处理,串口1变化,就更新串口1,串口2变化,就更新串口2
而不是逻辑都混到一起.你后面那么多&&是闹哪样,非要六个串口同时变化才更新,有1个不变就不更新???

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#读多串口,本人已经可以读6个串口,但是写入数据库时遇到了问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)