写入串口:如果太快则会出现乱码

时间:2014-06-26 16:51:30

标签: serial-port

我目前正致力于写一个串口来刺激设备。界面按照特定表单的字符串工作,以换行和回车结束。

波特率为9600,8N1。我们正在使用USB转串口转换器来创建虚拟COM端口。

问题:这只有在我一次发送一个字节的字符串(例如" ABC123FF")时才有效,每个字节之间至少有5毫秒的延迟。

简单的代码(C#):

using System;
using System.IO.Ports;
using System.Threading;

namespace COM_tester
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            if (port.IsOpen)
                port.Close();

            port.Open();
            Write(port, "ABC123FF", true);
            Console.Out.WriteLine("PORT: " + port.ReadExisting());
            port.Close();
            Console.In.Read();
        }

        static void Write(SerialPort port, string data, bool sleep)
        {
            foreach (char c in data)
            {
                port.Write(new string(c, 1));

                if (sleep)
                    Thread.Sleep(10);
            }
            port.Write(Environment.NewLine);
        }
    }
}

但是,在没有睡眠的情况下调用Write函数根本不起作用。如果有任何回应,那只是几个问号。使用port.WriteLine()具有相同的问题。

我也尝试过使用COM(CreateFile,WriteFile),同样的问题。

在PuTTy中与它连接起作用,但是我猜这是因为PuTTy正在以我输入的速度发送字节(大于10ms)。

这里发生了什么?

编辑:很遗憾,我无法再访问该设备,因此无法验证任何建议的修复程序。

1 个答案:

答案 0 :(得分:0)

在阅读之前,你需要等待进来。 在您调用ReadExisting之前,设备没有时间响应。 没有这项工作

Write(port, "ABC123FF", false);
Thread.Sleep(100)
Console.Out.WriteLine("PORT: " + port.ReadExisting());

理想情况下,您可以使用Read(缓冲区,偏移量,计数值)来等待某些事情进入。