2

我想知道是否有可能在单独的线程/进程中拥有某种事件处理程序,当使用 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,我只想使用它一次。

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

任何帮助,将不胜感激。

4

3 回答 3

1

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

定义事件

public event Action BytesWritten;

定义事件调用者

public void FireBytesWritten(){...}

定义事件处理程序

public void OnBytesWritten(...){}

在初始化或设置代码的某个地方将事件挂钩到事件处理程序

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
}
于 2013-08-09T09:17:35.897 回答
0

是的,只需在您的班级中创建事件并在适当的时候触发它。

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

于 2013-08-09T08:56:01.477 回答
0

正如您在文档中很容易看到的那样,内置SerialPort类中没有这样的事件。但当然,您可以在包装类中编写自己的方法,将消息拆分成更小的块并提供这样的事件。当然会有一点性能影响,但是因为串口线真的很慢,你不会感觉到的。

于 2013-08-09T09:15:33.647 回答