首页 文章

C#无法从串口Arduino读取完整缓冲区

提问于
浏览
0

我把Arduino连接到串口 . Arduino有以下简单的代码来发送字节:

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    Serial.write((char)100);
}

接收字节的代码(在单独的线程中):

int buffersize = 100000;
byte[] buffer = new byte[buffersize];

SerialPort port = new SerialPort("COM3", 9600);
port.ReadBufferSize = buffersize;
port.Open();

int bytesread = 0;
do
{
    bytesread = port.BytesToRead;
}
while(bytesread < buffersize && bytesread != buffersize);

port.Read(buffer, 0, buffersize);

我读到BytesToRead可以返回超过ReadBufferSize,因为它包含一个以上的缓冲区 . 但相反,我只能接收近12000,之后ReadBufferSize不会改变 . 所有波特率都会出现同样的问题 .

那么如何一次读取缓冲区中的所有100000字节?也许有一些驱动程序设置等?请帮忙 .

1 回答

  • 0

    如果Arduino以此波特率连续发送字节,则速度将最大为9600/10 = 960字节/秒(1个字节将需要10个波特:8个数据位1开始1个停止) . 然后将在超过104秒内收集100000个字节 . 如果通信没有中断,您的代码应该可以正常工作 . 要调试它,您可以在while循环中添加它:

    System.Threading.Thread.Sleep(1000); //sleep 1 second
    Console.WriteLine("Total accumulated = " + bytesread);
    

    但是,更好的方法是使用 SerialPortDataReceived 事件:

    int buffersize = 100000;
    SerialPort port = new SerialPort("COM3", 9600);
    
    port.DataReceived += port_DataReceived;
    
    // To be safe, set the buffer size as double the size you want to read once
    // This is for the case when the system is busy and delays the event processing
    port.ReadBufferSize = 2 * buffersize;
    
    // DataReceived event will be fired when in the receive buffer
    // are at least ReceivedBytesThreshold bytes
    port.ReceivedBytesThreshold = buffersize; 
    port.Open();
    

    事件处理程序:

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // The event will also be fired for EofChar (byte 0x1A), ignore it
        if (e.EventType == SerialData.Eof)
            return;
    
        // Read the BytesToRead value, 
        // don't assume it's exactly ReceivedBytesThreshold
        byte[] buffer = new byte[port.BytesToRead];
        port.Read(buffer, 0, buffer.Length);
    
        // ... Process the buffer ...
    }
    

相关问题