C# 在c语言中如何在一个com端口中同时接收多个任务

C# 在c语言中如何在一个com端口中同时接收多个任务,c#,serial-port,communication,C#,Serial Port,Communication,我是c语言的新手,我一直在做这个任务。我的要求是,我创建了许多线程,这些线程(使用COM1发送)必须与单个串行端口(如COM2)通信。所有线程都必须使用单个COM端口发送消息(使用COM2接收) 比如说,在超级终端中使用COM1发送“helloworld1”(使用线程1)和“helloworld2”(线程2),并使用COM2接收。所以我需要同时看到超级终端中的两个HelloWorld 请帮帮我 您将想要开始。 您可以为要发送/接收的每个COM端口实例化SerialPort类的2个实例。 我在Se

我是c语言的新手,我一直在做这个任务。我的要求是,我创建了许多线程,这些线程(使用COM1发送)必须与单个串行端口(如COM2)通信。所有线程都必须使用单个COM端口发送消息(使用COM2接收)

比如说,在超级终端中使用COM1发送“helloworld1”(使用线程1)和“helloworld2”(线程2),并使用COM2接收。所以我需要同时看到超级终端中的两个HelloWorld

请帮帮我

您将想要开始。 您可以为要发送/接收的每个COM端口实例化SerialPort类的2个实例。 我在SerialPort类中使用了两种接收数据的变体:
一,。您可以在特定的时间间隔手动“读取”端口(例如,您可以根据需要读取每个线程)。
二,。SerialPort类公开可以订阅的DataReceived事件(ErrorReceived也可用)

选项1可能是最合适的

编辑 在阅读您的评论之后,选项2可能更适合,这样您就可以有一个“接收”线程订阅DataReceived/ErrorReceived事件。 根据@Slider,还需要锁,以确保在任何给定时间只有一个线程在写入。

您需要开始。 您可以为要发送/接收的每个COM端口实例化SerialPort类的2个实例。 我在SerialPort类中使用了两种接收数据的变体:
一,。您可以在特定的时间间隔手动“读取”端口(例如,您可以根据需要读取每个线程)。
二,。SerialPort类公开可以订阅的DataReceived事件(ErrorReceived也可用)

选项1可能是最合适的

编辑 在阅读您的评论之后,选项2可能更适合,这样您就可以有一个“接收”线程订阅DataReceived/ErrorReceived事件。
根据@Slider,还需要使用锁来确保在任何给定时间只有一个线程在写入。

由于您希望从两个不同的线程发送,因此需要使用锁{}将调用SerialPort.Write()包围起来,如下所示:

SerialPort s = new SerialPort(); //configure serial port, etc. //spin off additional threads //in each thread, do this: lock(s) { s.Write("Hello World1"); }
由于您希望从两个不同的线程发送,因此需要使用锁{}将调用SerialPort.Write()包围起来,如下所示:

SerialPort s = new SerialPort(); //configure serial port, etc. //spin off additional threads //in each thread, do this: lock(s) { s.Write("Hello World1"); }
每个线程都需要在读取时打开和关闭端口吗?因为我担心.NET不允许两个实例打开一个COM端口。应该有一个实例用于COM1,在线程之间共享,一个实例用于COM2。用户403489说:所有线程都必须使用单个COM端口发送消息(使用COM2接收)。我想告诉他,只有一个THARD应该监听COM2端口,所有其他的在恢复数据后都可以写入它们的端口ports@adopilot:目前,我们广泛使用SerialPort类从pc到设备进行长时间(数天)的通话。我们打开该端口的共享实例一次,然后进行读/写操作。然后在Dispose上,关闭端口并清理线程,等等@user403489:如果只有一个线程应该侦听,那么DataReceived事件侦听可能是更好的解决方案。您可以订阅该事件,根据需要解析数据以确定数据是否“完整”,然后再通知适当的线程。请记住,串行通信没有“智能协议”,它只是一条线路上的字节数。您必须确定(例如通过数据包)所有预期数据均已“读取”。另外,请看@Slider345关于端口写入的“锁”的回答。每个线程是否都需要在读取时打开和关闭端口,因为我担心.NET不会允许两个实例打开一个COM端口。应该有一个实例用于COM1,在线程之间共享,一个实例用于COM2。用户403489说:所有线程都必须使用单个COM端口发送消息(使用COM2接收)。我想告诉他,只有一个THARD应该监听COM2端口,所有其他的在恢复数据后都可以写入它们的端口ports@adopilot:目前,我们广泛使用SerialPort类从pc到设备进行长时间(数天)的通话。我们打开该端口的共享实例一次,然后进行读/写操作。然后在Dispose上,关闭端口并清理线程,等等@user403489:如果只有一个线程应该侦听,那么DataReceived事件侦听可能是更好的解决方案。您可以订阅该事件,根据需要解析数据以确定数据是否“完整”,然后再通知适当的线程。请记住,串行通信没有“智能协议”,它只是一条线路上的字节数。您必须确定(例如通过数据包)所有预期数据均已“读取”。另外,请看@Slider345关于端口写入的“锁”的回答。谢谢大家的回复。。我会查查的。。谢谢你的回复。我只使用serialport打开了端口(COM1)(内部带有传递参数(本例中为COM1)),使用这个单一端口,我需要打开多个线程,使用同一端口发送消息,并在COM2接收消息。那么,我是否必须在线程中锁定端口,并在线程之间提供任何延迟,以便该端口在特定线程的特定时间内打开,然后将其解锁,以便另一个线程在特定时间访问该端口,依此类推???谢谢。是的,这基本上是正确的策略。lock命令本身将导致线程延迟,直到所有其他TheAD解锁串行端口。谢谢大家的回复。。我会查查的。。谢谢你的回复。我只使用serialport打开了端口(COM1)(内部带有传递参数(本例中为COM1)),使用这个单一端口,我需要打开多个线程,使用同一端口发送消息,并在COM2接收消息。那么,我是否必须在线程中锁定端口,并在线程之间提供任何延迟,以便该端口在一段特定时间内保持打开状态