C# 怎么同时打开两个串口?

Mou377 2017-03-08 07:38:38
private void comm_DataReceived1(object sender, SerialDataReceivedEventArgs e)
{
int n = serialPort1.BytesToRead;
byte[] buf = new byte[n];
serialPort1.Read(buf, 0, n);
builder.Clear();
this.Invoke((EventHandler)(delegate
{
builder.Append(Encoding.ASCII.GetString(buf));
this.box.AppendText(builder.ToString());
}
));


  private void comm_DataReceived2(object sender, SerialDataReceivedEventArgs e)
{
int m = comm.BytesToRead;
byte[] temp= new byte[m];
comm.Read(temp, 0, m);
foreach (byte var in temp)
{
temp.Add(var);
}
Thread.Sleep(200);
ReceiveContent.Clear();
}


1 : 2个串口分别对应2个comm_DataReceived,这样写对么?如果不对,该怎么写?
2 : 有com1,com2: 如果要comm_DataReceived1接收的com1的数据;comm_DataReceived2接收的com2的数据,该怎么做?(希望我这样描述没有错误)



...全文
1888 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴士上的邂逅 2017-08-09
  • 打赏
  • 举报
回复
引用 14 楼 S_S_1 的回复:
[quote=引用 13 楼 yuankaiwsl 的回复:] 新手都喜欢复制,给你一个“复制”的方法:假设第一个串口这样建的
            SerialPort serialPort1 = new SerialPort("COM1", 9600);
            serialPort1.DataReceived += serialPort1_DataReceived;
            serialPort1.Open();
        ......
        void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
复制这些代码,然后将后缀为1的改成2就行了
            SerialPort serialPort2 = new SerialPort("COM2", 9600);
            serialPort2.DataReceived += serialPort2_DataReceived;
            serialPort2.Open();
        ......
        void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
按照这个写法,如果有10个COMM口或N个,不得写N段了[/quote]N个COMM口就是N个实例,必须一个一个实例化,如果你的操作统一的话可以封装起来
巴士上的邂逅 2017-08-09
  • 打赏
  • 举报
回复
N个COMM口就是N个实例,必须一个一个实例化,如果你的操作统一的话可以封装起来
S_S_1 2017-08-09
  • 打赏
  • 举报
回复
引用 13 楼 yuankaiwsl 的回复:
新手都喜欢复制,给你一个“复制”的方法:假设第一个串口这样建的
            SerialPort serialPort1 = new SerialPort("COM1", 9600);
            serialPort1.DataReceived += serialPort1_DataReceived;
            serialPort1.Open();
        ......
        void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
复制这些代码,然后将后缀为1的改成2就行了
            SerialPort serialPort2 = new SerialPort("COM2", 9600);
            serialPort2.DataReceived += serialPort2_DataReceived;
            serialPort2.Open();
        ......
        void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
按照这个写法,如果有10个COMM口或N个,不得写N段了
threenewbee 2017-03-09
  • 打赏
  • 举报
回复
不同同时两个com控件和com口的一个端口通讯,启动两个窗口直接调用各自的show方法就可以了。
XBodhi. 2017-03-09
  • 打赏
  • 举报
回复
开2个实例就好了啊 。 comm 初始化2个,分别绑定不同的 com 口就可以了
巴士上的邂逅 2017-03-09
  • 打赏
  • 举报
回复
会建一个,第二个同理建一个就行
sdfgrtyu 2017-03-09
  • 打赏
  • 举报
回复
非主流,,,,
by_封爱 版主 2017-03-09
  • 打赏
  • 举报
回复
.... 你new一个button跟托上去一个button 有什么区别? 难道不是控件吗? 不管你是托上去或者是自己手写 都要设置串口那些属性 是一样的东西..
Mou377 2017-03-09
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
别听1#瞎说 这玩意跟多线程没一毛钱关系.. 打开一个串口 你实例化一个SerialPort1 . 并且注册回调DataReceived1 那么如果你要打开2个串口 那么你在实例化一个SerialPort2,注册 并且注册回调DataReceived2不就完了吗? 并且串口1应答的数据 只在datarec1里面 串口2的应答数据 只在datarec2里面
现在我没有用SerialPort控件,直接 comm.DataReceived += Comm_DataReceived;这样可以? 如果这样可以,怎么做:comm_DataReceived1接收的com1的数据;comm_DataReceived2接收的com2的数据?
wanghui0380 2017-03-09
  • 打赏
  • 举报
回复 1
首先你得找跟串口线,把你口里的COM1,Com2连起来,他们才能互相通信 如果你手上没有串口线(或者你机器上压根就没有串口),请先下“虚拟串口模拟器”,模拟出一组可以互相的通讯的串口再说
Mou377 2017-03-09
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
不同同时两个com控件和com口的一个端口通讯,启动两个窗口直接调用各自的show方法就可以了。
需求只能用一个窗口
by_封爱 版主 2017-03-09
  • 打赏
  • 举报
回复
别听1#瞎说 这玩意跟多线程没一毛钱关系.. 打开一个串口 你实例化一个SerialPort1 . 并且注册回调DataReceived1 那么如果你要打开2个串口 那么你在实例化一个SerialPort2,注册 并且注册回调DataReceived2不就完了吗? 并且串口1应答的数据 只在datarec1里面 串口2的应答数据 只在datarec2里面
巴士上的邂逅 2017-03-09
  • 打赏
  • 举报
回复
新手都喜欢复制,给你一个“复制”的方法:假设第一个串口这样建的
            SerialPort serialPort1 = new SerialPort("COM1", 9600);
            serialPort1.DataReceived += serialPort1_DataReceived;
            serialPort1.Open();
        ......
        void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
复制这些代码,然后将后缀为1的改成2就行了
            SerialPort serialPort2 = new SerialPort("COM2", 9600);
            serialPort2.DataReceived += serialPort2_DataReceived;
            serialPort2.Open();
        ......
        void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
Mou377 2017-03-09
  • 打赏
  • 举报
回复
引用 10 楼 qiaohuyue 的回复:
开2个实例就好了啊 。 comm 初始化2个,分别绑定不同的 com 口就可以了
引用 10 楼 qiaohuyue 的回复:
开2个实例就好了啊 。 comm 初始化2个,分别绑定不同的 com 口就可以了
就是不会绑定啊
Mou377 2017-03-09
  • 打赏
  • 举报
回复
引用 9 楼 yuankaiwsl 的回复:
会建一个,第二个同理建一个就行
刚接触C#不久,可以描述详细点么?
SoulRed 2017-03-08
  • 打赏
  • 举报
回复
可以用多线程试试
为了解决在测试模块通信距离中出现的误差大,每个人的测试条件都不一样,没有标准, 没有数据(数据最能说明问题),数据手动记录容易丢失,手动计算的误差大等情况.在经理的 指导下,特此开发了一款自动测试模块通信软件。 1。智能计算丢包个数,丢包率,增加误码判断,计算误码率,增加丢字节数,丢字节率判断。 2。测试记录,智能保存,点击保存可以将结果自动保存到txt文本中,便于查看和记录!让你在测试过程中更省心 更给力! 在测试过程中,只需要每次填写两个模块之间的距离即可,然后点击开始测试。该软件将自动计算所有的丢包率 丢字节个数 误码个数,误码率等,点击保存,将测试结果智能保存,并 打开,便于测试人员查看测试结果! 最后该软件得到的测试结果 为100m的情况误码率的情况,400m(需要用户自己设定)丢包率的情况 1000m的丢包率 误码率情况等所有信息,如下图所示。 3.增加ESC,自动退出功能。当用户想退出此程序,只需要按一下ESC键,便可关闭此程序(测试记录保存在d:\桑锐电子测试报告.txt不会丢失) 4.增加右键菜单功能。 5.串口设置信息以及发送区信息智能保存。(让测试过程设置信息更简单,更快速,更智能) 例如上次我们打开串口5,波特率为9600 ,校验位:偶校验,发送的数据为11 22 33 44 55 。 我们下次打开此工具默认串口串口5,波特率为9600 ,校验位:偶校验,发送的数据为11 22 33 44 55 6.操作起来更简单。 点击开始测试,将自动打开串口,然后自动按照设定的发送包个数(例如我们设定总共发送500包) 发送周期为1000ms,模块之间的距离为100m,点击开始测试,自动打开串口,自动开始发送设定的字符。 发送到例如100包(您设定总共发送100包),就停止发送。 7.程序指令集重新优化,整体程序大小仅44kb.更加便于存储和便于传输!(需安装.net2.0)

110,534

社区成员

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

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

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