我将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字节?也许有一些驱动程序设置等? 请帮忙。
答案 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();