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

时间:2014-03-31 17:51:39

标签: c# serial-port arduino

我将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 :(得分: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);

但是,更好的方法是使用DataReceived的{​​{1}}事件:

SerialPort

事件处理程序:

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();
相关问题