我正在使用System.IO.Ports
。
我向设备发送消息,并希望等待来自设备的所有消息。
我正在尝试这样做:
message = Console.ReadLine();
_serialPort.Write(message);
Console.WriteLine(_serialPort.ReadExisting());
但是它仅返回第一行。
我尝试使用port.BytesToRead
,但得到的结果相同。
当我使用ReadLine()
时,它什么也不会返回。
编辑:
要查看所有行,请使用事件处理程序。
我的问题的解决方案是在最后一行使用\ r(输入)。
答案 0 :(得分:2)
ReadExisting返回确切时间的可用字节,在读取缓冲区之前要延迟一下,解决方法是
message = Console.ReadLine();
_serialPort.Write(message);
Thread.Sleep(200);
Console.WriteLine(_serialPort.ReadExisting());
编辑2: 这是我在项目中的操作方式
private SerialPort port;
string DataReceived = string.Empty;
public string OpenPort(string PortName, int BaudRate)
{
// if the port is already used by other window then return the same instance
if (port != null)
if(port.IsOpen)
return "True";
port = new SerialPort(PortName, BaudRate, Parity.None, 8, StopBits.One);
// Attach a method to be called when there
// is data waiting in the port's buffer
port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
// Begin communications
try
{
port.Open();
}
catch(Exception ex)
{
return ex.Message;
}
return "True";
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.sleep(200);
DataReceived = port.ReadExisting();
}
在主屏幕上
message = Console.ReadLine();
_serialPort.Write(message);
//use Stopwatch to calculate time befor you can exit from the loop
while(true)
{
if(!string.IsNullOrWhiteSpace(DataReceived))
break;
// Todo : Check stopwatch for timeout
}
答案 1 :(得分:0)
也许您的串行设备可能遇到了换行问题,请尝试:
message = Console.ReadLine();
_serialPort.WriteLine(message);
Console.WriteLine(_serialPort.ReadExisting()); # try debug here replace with string test = _serialPort.ReadLine();