2

我有一个 C# 应用程序,其中串行(COM1)数据似乎有时无法传输。以下是我的代码的简化片段(已删除对 textBox 写入的调用):

    InitializeComponent()
    {
       // 
       // serialPort1
       // 
       this.serialPort1.BaudRate = 115200;
       this.serialPort1.DiscardNull = true;
       this.serialPort1.ReadTimeout = 500;
       this.serialPort1.ReceivedBytesThreshold = 2;
       this.serialPort1.WriteTimeout = 500;
       this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
    }

        if (radioButtonUart9600.Checked)
        {
           serialPort1.BaudRate = 9600;

           try
           {
              serialPort1.Open();
           }
           catch (SystemException ex)
           {
              /* ... */
           }
        }

        try
        {
           serialPort1.Write("D");
           serialPort1.Write(msg, 0, 512);
           serialPort1.Write("d");
           serialPort1.Write(pCsum, 0, 2);
        }
        catch (SystemException ex)
        {
           /* ... */
        }

奇怪的是,当端口配置为 115.2Kbps 时,同样的代码工作得很好。但是,当以 9600bps 运行时,该代码应该传输的数据似乎没有被传输。我已经通过监视远程设备上的接收标志来验证这一点。try 语句中不会抛出异常。我应该做些什么(刷新等)来确保数据被传输?您可能有的任何想法或建议将不胜感激。我正在使用 Microsoft Visual C# 2008 Express Edition。谢谢。

4

1 回答 1

4

删除这些 try/catch 块。这应该让您有机会看到您获得的 TimeoutException,因为您将 WriteTimeout 值设置得太低。以 9600 波特率发送 516 个字节需要 538 毫秒。

您的其他设置也是麻烦的秘诀。摆脱 ReceivedBytesThreshold 和 DiscardNull。

于 2010-05-17T20:53:33.267 回答