C#编写一个上位机程序的通讯问题

「已注销」 2017-04-28 08:57:44
最近在编写一个上位机程序,发送数据部分已经编写完成,但是下位机还要实时传输传感器数据给上位机,这样的话,我得用2个线程吗,一个用来发送数据,一个用来接收数据,还有我需要2个serialport控件吗,如果只是一个serialport控件,我感觉自己发送的数据也被自己接收?各位大神求助啊!!!
...全文
307 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-05-02
  • 打赏
  • 举报
回复
我知道了,我自己之前进入了一个误区,我之前将上位机的数据发送给下位机整个过程都是用一台电脑加一个CH340芯片完成的,我电脑把数据发送给自己并显示出来,我以为换了下位机以后,我发送的数据还会在serialport..readbyte显示,其实是不会的,serialport.readbyte只显示我收到的数据,之前之所以显示发送的数据是因为我发送的数据也恰好是我收到的数据!!!!!!!
「已注销」 2017-04-28
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 3 楼 weixin_38235514 的回复:]我从来也没想过用死循环啊!!
如果你说你没有考虑用“死循环”,那么我就明白,你根本没有理解你自己说的“用两个线程,一个收、一个发”到底是什么意思了!!! 我再给你说明一下 .net 中发信息怎么发送
serialport.Send(bytes);
这样一句话就发送数据了。创建什么线程? serialport 类型对象提供了 DataReceived 之类的事件,是在这里读取数据,它会在子线程中来回调你的事件处理代码,用你创建线程吗? 所以你说的“用两个线程”,假设你不是为了死循环地那种方式去阻塞和循环去 Read、Write 的话,那么你连自己说的是什么具体流程都不明白了。这样就可能是在为了名词儿而名词儿,并没有什么实际的设计了。[/quote]我大概知道了一点,我就是怕我要是用一个serialport控件的话是不是自己上位机发的数据和下位机传上来的数据会冲突啊?
  • 打赏
  • 举报
回复
上面把 Send 改成 Write 吧。其实这里的主要意思是一样的,你会为一条 serial.Write(str) 这样的语句而说“我得创建一个线程,专门处理所有的写操作”,这如果不是死循环的流程,那么你就连流程可能都还画不出来、没有想过。
  • 打赏
  • 举报
回复
引用 3 楼 weixin_38235514 的回复:
我从来也没想过用死循环啊!!
如果你说你没有考虑用“死循环”,那么我就明白,你根本没有理解你自己说的“用两个线程,一个收、一个发”到底是什么意思了!!! 我再给你说明一下 .net 中发信息怎么发送
serialport.Send(bytes);
这样一句话就发送数据了。创建什么线程? serialport 类型对象提供了 DataReceived 之类的事件,是在这里读取数据,它会在子线程中来回调你的事件处理代码,用你创建线程吗? 所以你说的“用两个线程”,假设你不是为了死循环地那种方式去阻塞和循环去 Read、Write 的话,那么你连自己说的是什么具体流程都不明白了。这样就可能是在为了名词儿而名词儿,并没有什么实际的设计了。
「已注销」 2017-04-28
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
我再给你说明一个差异,比如说有一个操作大量调用,并且是并行地调用,那么我们就可以写类似这样的代码
private static lockflag = new object()[

void test(byte[] data)
{
    .......
    lock(lockflag)
    {
        count ++;
        device.Send(data);
    }
    .......
}
这里假设这个 test 方法会大量并发执行,其中有需要线程管理的部分,使得同一时刻只有一个线程能进入这个管理区域,那么我们写 lock 语句。 这个简单的 lock 语句,在很早以前,被说成是必须自己设计一个什么“队列系统”来弄一个独立的“线程”在那里去执行大括号中事情。你觉得学会了 lock 同步语句之后还有必要单独设计一个队列系统吗? 再比如说随时动态注册一个动态委托,将任务交给系统线程池去操作,我们可以写
var a = 1;
ThreadPool.QueueUserWorkItem(h =>
{
    var b = a + 2;
    ........
});
或者是使用 async/await,或者 PLinq,或者其它许多方法,这是因为 .net 自己有线程池机制,用不着编程者每一个人都另外再来发明线程池,所以你直接使用 .net 的系统规范方法,这里不用考虑什么“队列”。 这里我说明的是,如果你搞明白应用编程模式,就不会过分技术化地追求底层技术概念。
我是新手,很多东西没用过,听得不是太懂,能不能说得再清楚点啊,有没有跟应用编程模式相关的资料啊,让我学习下
  • 打赏
  • 举报
回复
我再给你说明一个差异,比如说有一个操作大量调用,并且是并行地调用,那么我们就可以写类似这样的代码
private static lockflag = new object()[

void test(byte[] data)
{
    .......
    lock(lockflag)
    {
        count ++;
        device.Send(data);
    }
    .......
}
这里假设这个 test 方法会大量并发执行,其中有需要线程管理的部分,使得同一时刻只有一个线程能进入这个管理区域,那么我们写 lock 语句。 这个简单的 lock 语句,在很早以前,被说成是必须自己设计一个什么“队列系统”来弄一个独立的“线程”在那里去执行大括号中事情。你觉得学会了 lock 同步语句之后还有必要单独设计一个队列系统吗? 再比如说随时动态注册一个动态委托,将任务交给系统线程池去操作,我们可以写
var a = 1;
ThreadPool.QueueUserWorkItem(h =>
{
    var b = a + 2;
    ........
});
或者是使用 async/await,或者 PLinq,或者其它许多方法,这是因为 .net 自己有线程池机制,用不着编程者每一个人都另外再来发明线程池,所以你直接使用 .net 的系统规范方法,这里不用考虑什么“队列”。 这里我说明的是,如果你搞明白应用编程模式,就不会过分技术化地追求底层技术概念。
「已注销」 2017-04-28
  • 打赏
  • 举报
回复
引用 1 楼 DOwnstairs 的回复:
最好不要两个线程。多线程会很复杂,估计你是新手。单线程就好。
单线程的接收和发送可以同时进行?我的serialport要用几个?
「已注销」 2017-04-28
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
事件驱动,操作系统(这里是指 .net 系统层)收到数据时会触发事件回调,然后你就能读取当前数据,然后就结束了这个I/O读取过程。所以这里根本没有什么乱七八糟的“死循环”思路。 而发送数据更是如此。当程序需要发送数据,你使用串口对象,直接 Send 数据就行了。发完就完了。用什么额外的死循环思路? 你是脱离了实际去听信了一些 java 论坛的说法吧。因为10几年前的 java 入门书最爱讲什么“生产者-消费者”模式、队列之类的。因为它们的现成的框架很少,所以入门书喜欢罗列理论概念。 但是上面我已经说明白了,1. 事件驱动来接收数据,2.直接发送数据。
我从来也没想过用死循环啊!!
  • 打赏
  • 举报
回复
事件驱动,操作系统(这里是指 .net 系统层)收到数据时会触发事件回调,然后你就能读取当前数据,然后就结束了这个I/O读取过程。所以这里根本没有什么乱七八糟的“死循环”思路。 而发送数据更是如此。当程序需要发送数据,你使用串口对象,直接 Send 数据就行了。发完就完了。用什么额外的死循环思路? 你是脱离了实际去听信了一些 java 论坛的说法吧。因为10几年前的 java 入门书最爱讲什么“生产者-消费者”模式、队列之类的。因为它们的现成的框架很少,所以入门书喜欢罗列理论概念。 但是上面我已经说明白了,1. 事件驱动来接收数据,2.直接发送数据。
SoulRed 2017-04-28
  • 打赏
  • 举报
回复
最好不要两个线程。多线程会很复杂,估计你是新手。单线程就好。

110,533

社区成员

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

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

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