串口写入单个字节后的c#事件处理程序

时间:2013-08-09 08:53:21

标签: c# .net serial-port byte

我想知道是否可以在单独的线程/进程中使用某种事件处理程序,当使用comport.Write(...)发送单个字节时会触发该事件处理程序。

请考虑这部分代码:

public SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);    
comport.Write(buf, 0, buf.Length);

现在让我们说buf.Lenght是1000.我的程序停止直到我发送所有1000个字节。 我不想分开comport.Write,我只想用它一次。

现在有可能每次发送一个字节,某种事件处理程序可以打开例如更新进程条等,而不会中断发送到的数据(不会减慢它)。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

SerialPort类不提供开箱即用的功能,但您可以添加此功能。步骤(用记事本编写为元代码,需要将其转换为正确的C#并添加错误处理,边界条件和参数检查)

定义一个事件

public event Action BytesWritten;

定义事件调用者

public void FireBytesWritten(){...}

定义事件处理程序

public void OnBytesWritten(...){}

在init的某处将事件挂钩到事件处理程序或设置代码

this.BytesWritten += OnBytesWritten;

现在添加一个循环包装语句,并在写入N个字节时触发事件

SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);

int chunkSize = 1; // 1 byte for the chunk size
for(int i = 0; i < buf.Length; i += chunkSize)
{
    // Write small amount of bytes
    comport.Write(buf, i, chunkSize);

    // Fire an event saying that many bytes were written
    FireBytesWritten(...);

    //do checks for boundary conditions, add error handling if Write fails
}

答案 1 :(得分:0)

是的,只需在课堂内创建活动并在适当的时候启动它。

http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

答案 2 :(得分:0)

正如您在documentation中可以轻松看到的那样,内置SerialPort类中没有此类事件。但是当然你可以在一个包装类中编写自己的方法,它将消息分成更小的块并提供这样的事件。当然会有很小的性能损失,但由于串行线路很慢,你不会感觉到它。