c# 多个SerialPort 同时接收数据

wanzhi116 2013-06-14 01:02:28
想通过多个线程打开多个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 事件接收多线程串口的数据?应该怎么写?
}
...全文
731 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xky96 2013-06-15
  • 打赏
  • 举报
回复
在richTextBox1 中显示收到的数据,16进制方式
wanzhi116 2013-06-15
  • 打赏
  • 举报
回复
        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 错误?
xky96 2013-06-15
  • 打赏
  • 举报
回复
引用 7 楼 wanzhi116 的回复:
问题是开一个串口能正常显示 读取,接收。开两个及以上就显示错误
这么多人回答你了 比如3楼让你每个串口对应一个事件处理方法 4楼虽然让你多串口共用一个事件处理方法,但内部必须区分串口 象你这个例子,建议用4楼的做法 另外既然用了DataReceived事件,就没必要用线程,它会自动启线程;反之,如果用线程,就不用DataReceived事件
linuxca 2013-06-15
  • 打赏
  • 举报
回复
wanzhi116 2013-06-15
  • 打赏
  • 举报
回复
问题是开一个串口能正常显示 读取,接收。开两个及以上就显示错误
tcmakebest 2013-06-14
  • 打赏
  • 举报
回复
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);
}
dd_zhouqian 2013-06-14
  • 打赏
  • 举报
回复
每个串口的处理函数绑定不同的委托函数试试

comPort[1].DataReceived += new SerialDataReceivedEventHandler(DataReceived1)
comPort[2].DataReceived += new SerialDataReceivedEventHandler(DataReceived2)
.....
周美文 2013-06-14
  • 打赏
  • 举报
回复
每个串口收到数据后都写到同一个东东里面。然后再处理
xky96 2013-06-14
  • 打赏
  • 举报
回复
DataReceived事件会自动创建线程

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧