C#Can';t从串行端口Arduino读取完全缓冲区
我已将Arduino连接到串行端口。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
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 ...
}