我有一些设备需要使用SerialPort建立连接。 该设备从我这边接收命令并向我发送数据。 我在同一个班级做所有的发送/接收=>相同的线程。
我已连接到此设备,并且我成功从/向此设备发送/接收命令和数据。
我需要每25毫秒发送一个命令是“给我你的状态” - 这意味着我要求设备发回一些带有数据的结构。
如果我错过了一些接收数据...当我做'serialPortStream.BytesToRead'(测试是否有一些数据要获得)时,我会在我的ByteReading上找到我还没有放弃的旧缓冲区吗? 如果我错过了我需要阅读的最后一个包裹,或者收到的新数据将删除以前收到的旧数据,我将拥有多少包裹?
答案 0 :(得分:2)
使用OnRecieveData处理程序将数据保存到ConcurrentQueue或类似的东西。
namespace Test
{ class Program
{
const int bufSize = 2048;
static void Main(string[] args)
{
Byte[] buf = new Byte[bufSize];
SerialPort sp = new SerialPort("COM1", 115200);
sp.DataReceived += port_OnReceiveData; // Add DataReceived Event Handler
sp.Open();
// Wait for data or user input to continue.
Console.ReadLine();
sp.Close();
}
private static void port_OnReceiveData(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort) sender;
switch(e.EventType)
{
case SerialData.Chars:
{
Byte[] buf = new Byte[bufSize];
port.Read(buf, 0, bufSize)
Console.WriteLine("Recieved data! " + buf.ToString());
break;
}
case SerialData.Eof:
{
// means receiving ended
break;
}
}
}
}
}