如何控制一条线程监听一个串口?

OopsJeff 2013-09-15 10:27:47
如何控制一条线程监听一个串口?
我发现我写的这个监听,会开启很多条线程来读取串口数据..

 

port.DataReceived += comm_DataReceived;

void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{Thread t = new Thread(() =>
{

... 读取串口数据
});

t.Start();

...全文
275 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我卷福 2013-09-16
  • 打赏
  • 举报
回复
SerialPort 帮你把所有的事情都做完了 每个SerialPort对应一个串口 监听DataReceived事件 在事件处理程序中处理数据 不需要你再搞多线程
知擎物联 2013-09-16
  • 打赏
  • 举报
回复
50个以上的串口,还不用串口总线?
  • 打赏
  • 举报
回复
引用 楼主 meiyoudao 的回复:
如何控制一条线程监听一个串口? 我发现我写的这个监听,会开启很多条线程来读取串口数据..
 

 port.DataReceived += comm_DataReceived;

void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {Thread t = new Thread(() =>
            {

...  读取串口数据
 });

            t.Start(); 

你的“读取串口数据”操作用多长时间执行完? 如果它读完数据,然后处理所读取的数据,然后结束,那么它一瞬间就完毕了。 估计你在这个操作里搞了什么坑爹的“循环、阻塞、等待”流程了吧?
Frog1228 2013-09-16
  • 打赏
  • 举报
回复
引用 11 楼 meiyoudao 的回复:
引用 10 楼 mjjackey 的回复:
[quote=引用 9 楼 meiyoudao 的回复:] [quote=引用 8 楼 mjjackey 的回复:] [quote=引用 7 楼 meiyoudao 的回复:] [quote=引用 5 楼 mjjackey 的回复:] comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
comm_DataReceived里你没访问UI吧?我没试过50个以上串口。但是我觉得应该也没问题啊。[/quote]
 this.Invoke(new WriteInvoke(Write),
                                        new object[] { "读取到的内容" });
我用这样来传给UI[/quote] 你用Invoke当然可能会卡,它是同步的。[/quote] 那应该用什么?[/quote] BeginInvoke。
OopsJeff 2013-09-16
  • 打赏
  • 举报
回复
引用 10 楼 mjjackey 的回复:
引用 9 楼 meiyoudao 的回复:
[quote=引用 8 楼 mjjackey 的回复:] [quote=引用 7 楼 meiyoudao 的回复:] [quote=引用 5 楼 mjjackey 的回复:] comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
comm_DataReceived里你没访问UI吧?我没试过50个以上串口。但是我觉得应该也没问题啊。[/quote]
 this.Invoke(new WriteInvoke(Write),
                                        new object[] { "读取到的内容" });
我用这样来传给UI[/quote] 你用Invoke当然可能会卡,它是同步的。[/quote] 那应该用什么?
Frog1228 2013-09-16
  • 打赏
  • 举报
回复
引用 9 楼 meiyoudao 的回复:
引用 8 楼 mjjackey 的回复:
[quote=引用 7 楼 meiyoudao 的回复:] [quote=引用 5 楼 mjjackey 的回复:] comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
comm_DataReceived里你没访问UI吧?我没试过50个以上串口。但是我觉得应该也没问题啊。[/quote]
 this.Invoke(new WriteInvoke(Write),
                                        new object[] { "读取到的内容" });
我用这样来传给UI[/quote] 你用Invoke当然可能会卡,它是同步的。
OopsJeff 2013-09-16
  • 打赏
  • 举报
回复
引用 8 楼 mjjackey 的回复:
引用 7 楼 meiyoudao 的回复:
[quote=引用 5 楼 mjjackey 的回复:] comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
comm_DataReceived里你没访问UI吧?我没试过50个以上串口。但是我觉得应该也没问题啊。[/quote]
 this.Invoke(new WriteInvoke(Write),
                                        new object[] { "读取到的内容" });
我用这样来传给UI
Frog1228 2013-09-16
  • 打赏
  • 举报
回复
引用 7 楼 meiyoudao 的回复:
引用 5 楼 mjjackey 的回复:
comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
comm_DataReceived里你没访问UI吧?我没试过50个以上串口。但是我觉得应该也没问题啊。
OopsJeff 2013-09-16
  • 打赏
  • 举报
回复
引用 5 楼 mjjackey 的回复:
comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
但是串口多于50个以上,就程序卡死掉.就那种假死状态
OopsJeff 2013-09-16
  • 打赏
  • 举报
回复
引用 4 楼 xiaozhi_5638 的回复:
SerialPort 帮你把所有的事情都做完了 每个SerialPort对应一个串口 监听DataReceived事件 在事件处理程序中处理数据 不需要你再搞多线程
但是串口多于50个以上,就程序卡死掉.就那种假死状态
Frog1228 2013-09-16
  • 打赏
  • 举报
回复
comm_DataReceived本身已经开了一个线程来处理了。每一个串口都有一个comm_DataReceived事件。在comm_DataReceived里添加数据处理代码,但是如果是高频大数据的话,单独开一个线程来处理数据。comm_DataReceived里只接受数据。
OopsJeff 2013-09-15
  • 打赏
  • 举报
回复
引用 1 楼 GERRARD__8 的回复:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) 不要再这里面启动线程
在哪里启动呢? 我现在不止一个监听,我是有多个串口需要监听,如果都是主线程来取的话,程序就会卡住,假死掉
GERRARD__8 2013-09-15
  • 打赏
  • 举报
回复
直接在这个函数里面 把你的串口数据放到你想要的地方去就可以了
GERRARD__8 2013-09-15
  • 打赏
  • 举报
回复
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) 不要再这里面启动线程

111,097

社区成员

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

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

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