sar*_*ake 12 c# compact-framework serial-port
我已经尝试使用Readline()并且数据被删除,我尝试使用Read()但我不知道如何使用它的错误验证方法,因为我可能会一个接一个地获得几个数据包而我无法知道将会有另一个数据包进入.在数据包BytesToRead之间是0,所以我不能使用它.当读取数据到缓冲区时你有一个定时器或让线程进入休眠状态以允许所有数据包到达?
我搞不清楚了.不知道下一步该尝试什么.
我应该提一下,我不能保证串口的字符串将以\n或\ r或\ r \n结束.当用户按下PRINT时,我只需要一种简单的方法来读取将来自秤的所有数据包.
有人在这里回答了我喜欢的想法 - 等待所有数据包的一定时间,但他们删除了他们的答案.你有可能重新发布它吗?
Sam*_*uel 22
你试过听DataRecieved的事件SerialPort类?
public class MySerialReader : IDisposable
{
private SerialPort serialPort;
private Queue<byte> recievedData = new Queue<byte>();
public MySerialReader()
{
serialPort = new SerialPort();
serialPort.Open();
serialPort.DataReceived += serialPort_DataReceived;
}
void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort.BytesToRead];
serialPort.Read(data, 0, data.Length);
data.ToList().ForEach(b => recievedData.Enqueue(b));
processData();
}
void processData()
{
// Determine if we have a "packet" in the queue
if (recievedData.Count > 50)
{
var packet = Enumerable.Range(0, 50).Select(i => recievedData.Dequeue());
}
}
public void Dispose()
{
if (serialPort != null)
serialPort.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
Byr*_*oss 10
我们前一段时间经历了同样的过程.
读取"数据包"的唯一方法是有一些关于它们的开始和结束位于流中的概念.
来自msdn:
因为SerialPort类缓冲数据,并且BaseStream属性中包含的流没有,所以两者可能会争用可读取的字节数.BytesToRead属性可以指示有要读取的字节,但BaseStream属性中包含的流可能无法访问这些字节,因为它们已缓冲到SerialPort类.
我们使用了一个backround线程(你可以使用BackgroundWorker)将数据读入缓冲区.如果你不能使用SerialPort.Newline属性可靠地设置终止字符(因为它会变化!)那么你将需要实现自己的数据包检测系统,因为你无法使用阻塞的SerialPort.Readline()方法.
您可以使用SerialPort.Read()(或使用SerialPort.ReadExisting()方法的字符串)读入字节缓冲区,并在检测到数据中的有效数据包时生成事件.请注意,Read()(我假设ReadExisting())清空SerialPort的缓冲区,因此您需要将数据保存在其他位置.
如果设置SerialPort.ReadTimeout,则可以处理TimeoutException,并可以轻松处理设备未传输的情况.如果您使用固定数量的字节或其他一些非终止方案,这是重置数据包检测的好方法.(如果不需要部分数据包,请在超时时使用SerialPort.DiscardInBuffer()).
祝好运