当前位置:编程学习 > C#/ASP.NET >>

c# 多个SerialPort 同时接收数据

想通过多个线程打开多个SerialPort 使得每个SerialPort 同时接收数据。
for (int i = 0; i < 9; i++)
            {

                if (Opera[i])
                {

                    mYRun[i] = new Thread(ReadDevice1);
                    mYRun[i].Start(comPort[i].PortName);
                   
                }//启动线程
            }

private void ReadDevice1(object Num) 
        {
  ////向串口写入数据
                            comPort[i].DiscardInBuffer();
                            comPort[i].DiscardOutBuffer();
                            comPort[i].Write(sendData, 0, sendData.Length);
        comPort[i].DataReceived += new SerialDataReceivedEventHandler(DataReceived)
//串口接收数据
现在是开一个串口能正常接收数据,但是开两个串口就无法正常接收数据,这是为什么呢?
难道不能用SerialPort 的DataReceived 事件接收多线程串口的数据?应该怎么写?
          } --------------------编程问答-------------------- DataReceived事件会自动创建线程 --------------------编程问答-------------------- 每个串口收到数据后都写到同一个东东里面。然后再处理 --------------------编程问答-------------------- 每个串口的处理函数绑定不同的委托函数试试

comPort[1].DataReceived += new SerialDataReceivedEventHandler(DataReceived1)
comPort[2].DataReceived += new SerialDataReceivedEventHandler(DataReceived2)
.....

--------------------编程问答-------------------- DataReceived 方法内部应区别开不同的串口,并使用不同的变量保存数据。
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = sender as SerialPort;
    int len = sp.BytesToRead;
    byte[] buff = new byte[len];
    sp.Read(buff, 0, len);
}
--------------------编程问答--------------------
        void DataReceived(object o, SerialDataReceivedEventArgs e)
        {
           
            byte[] b = new byte[comPort[int100].BytesToRead];//定义byte数组,serialPort读取数据               

             comPort[int100].Read(b, 0, b.Length);
            str = "";      
            if (b.Length > 0)
            {
                for (int i = 0; i < b.Length; i++)
                {
                
                   str += string.Format("{0:X2} ", b[i]);
                  
                   
                } 
           richTextBox1.Invoke
    (
        new MethodInvoker
        (
            delegate
            {
   
               Application.DoEvents();
               richTextBox1.AppendText( DateTime.Now + ": " + str + "\n");
            }
        )
     );

这样写是不是导致显示在 richTextBox1 错误? --------------------编程问答-------------------- 在richTextBox1 中显示收到的数据,16进制方式 --------------------编程问答-------------------- 问题是开一个串口能正常显示 读取,接收。开两个及以上就显示错误 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 7 楼 wanzhi116 的回复:
问题是开一个串口能正常显示 读取,接收。开两个及以上就显示错误

这么多人回答你了
比如3楼让你每个串口对应一个事件处理方法

4楼虽然让你多串口共用一个事件处理方法,但内部必须区分串口
象你这个例子,建议用4楼的做法
另外既然用了DataReceived事件,就没必要用线程,它会自动启线程;反之,如果用线程,就不用DataReceived事件 --------------------编程问答-------------------- 除
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,