Com端口最大速度

时间:2014-08-11 19:48:25

标签: c# serial-port port

我有一个硬件,它以以下形式向com端口发送数据:" HxxxxVxxxx"其中x =数字:例如:(H1234V5678)。

我想问一下,我该如何设置采样率以尽快发送。 (波特9600,8位,奇偶校验:无,停止位:1)。 用Java或C#编写的程序能够整体而不是部分地回收这些数据。

每22ms发送一次数据,并接收此类数据:

2014-08-11 18:48:39.669  56 36 36 37 
2014-08-11 18:48:39.674  48 30 0D 0A 
2014-08-11 18:48:39.687  56 36 
2014-08-11 18:48:39.692  36 39 48 30 
2014-08-11 18:48:39.696  0D 0A 
2014-08-11 18:48:39.712  56 36 36 38 
2014-08-11 18:48:39.716  48 30 0D 0A 
2014-08-11 18:48:39.732  56 36 
2014-08-11 18:48:39.737  36 37 48 30 
2014-08-11 18:48:39.742  0D 0A 
2014-08-11 18:48:39.753  56 

但我想的是:

2014-08-11 18:48:39.600  56 36 36 37 48 30 0D 0A 
2014-08-11 18:48:39.622  56 36 36 37 48 30 0D 0A 
2014-08-11 18:48:39.644  56 36 36 37 48 30 0D 0A 
2014-08-11 18:48:39.666  56 36 36 37 48 30 0D 0A 
2014-08-11 18:48:39.688  56 36 36 37 48 30 0D 0A 

c#c​​ode:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
    int bytes = comport.BytesToRead;
    byte[] buffer = new byte[bytes];
    comport.Read(buffer, 0, bytes);

    File.AppendAllText(@"c:\file.txt", timestamp + "  "+ByteArrayToHexString(buffer) +"\n" + Environment.NewLine);
}

2 个答案:

答案 0 :(得分:2)

您收到的数据看起来与以下格式略有不同:" HxxxxVxxxx"

我阅读您的日志的方式,您正在接收" V66H0 \ r \ n"。 (\ r =回车,\ n =换行)

如果您可以保证所有单个命令都以\ r \ n(0x0D,0x0A)结尾,那么您有2个选项:

  1. 创建一个缓冲区并继续添加它,直到你达到0x0D 0x0A,然后你可以将它作为一行处理。

  2. 您可以将代码更改为使用同步SerialPort.DataRecieved方法,而不是使用异步SerialPort.ReadLine()事件,该方法将一次读取整行。

    < / LI>

    这显然是简化的,但应该是这样的:

    public bool KeepRunning = true;
    while(KeepRunning)
    {
        string command = serialport.ReadLine();
        processCommand(command);
    }
    

    其中serialport是已经打开的SerialPort对象,而processCommand是一种处理整行的方法。

答案 1 :(得分:0)

更改波特率不会为您提供所需的结果 。 SerialPort类(也不是任何基于Stream的类,这是类试图模拟的)保证接收的数据的确切数量将是您请求的数量。如果您需要8字节块,则需要缓冲传入数据,每次获得8字节数据时,都会返回结果。

你需要在读取串口和File.AppendAllText之间放一层来缓冲,这样你就可以建立起来,直到你有8个字节的数据,然后写出文件。

private byte[] buffer = new byte[8];
private int bufferOffset = 0;

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int totalBytesToRead = comport.BytesToRead;
    int totalBytesRead = 0;

    while (totalBytesToRead > totalBytesRead)
    {
        //Chooses the remaining size in the buffer or the remaining bytes available to read, whichever is smaller.
        var bytesToRead = Math.Min(buffer.Length - bufferOffset, totalBytesToRead - totalBytesRead);

        var bytesRead = comport.Read(buffer, bufferOffset, bytesToRead);

        bufferOffset += bytesRead;
        totalBytesRead += bytesRead;

        //If we have filled our buffer write it out to the file.
        if (bufferOffset == buffer.Length)
        {
            string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
            File.AppendAllText(@"c:\file.txt", timestamp + "  " + ByteArrayToHexString(buffer) + "\n" + Environment.NewLine);
            bufferOffset = 0;
        }
    }
}