Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Can';t从串行端口Arduino读取完全缓冲区_C#_Serial Port_Arduino - Fatal编程技术网

C#Can';t从串行端口Arduino读取完全缓冲区

C#Can';t从串行端口Arduino读取完全缓冲区,c#,serial-port,arduino,C#,Serial Port,Arduino,我已将Arduino连接到串行端口。Arduino具有以下发送字节的简单代码: void setup() { Serial.begin(9600); } void loop() { Serial.write((char)100); } 接收字节的代码(在单独的线程中): int buffersize=100000; 字节[]缓冲区=新字节[buffersize]; SerialPort端口=新的SerialPort(“COM3”,9600); port.ReadBufferS

我已将Arduino连接到串行端口。Arduino具有以下发送字节的简单代码:

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

void loop()
{
    Serial.write((char)100);
}
接收字节的代码(在单独的线程中):

int buffersize=100000;
字节[]缓冲区=新字节[buffersize];
SerialPort端口=新的SerialPort(“COM3”,9600);
port.ReadBufferSize=缓冲区大小;
port.Open();
int字节读取=0;
做
{
bytesread=port.BytesToRead;
}
while(bytesread
我了解到BytesToRead可以返回超过ReadBufferSize的值,因为它包含一个以上的缓冲区。但我只能收到近12000个,在这之后,ReadBufferSize不会改变。所有波特率都会出现同样的问题

那么,如何一次读取缓冲区中的所有100000字节呢?可能有一些驱动程序设置等?
请提供帮助。

如果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);
但是,更好的方法是使用
SerialPort
DataReceived
事件:

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 ...
}

您应该读取缓冲区中可用的内容,并将其粘贴到其他地方进行处理。这本书又读了一遍,以此类推。
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 ...
}