我创建了一个软件,它从RFID标签读取值,并通过串口连接到计算机。当我在调试模式下运行程序时,会收到正确的值,但是当我在发布模式下运行它时会显示不同的值。
RFID在调试模式下发送的值是\n00200054476720D\r\n
,但是当我在发布模式下运行时,它以小块显示值,或者有时显示空值,后跟该代码。
这是我的代码:
try
{
_port2.PortName = "COM" + doorport_txt.Text;
_port2.BaudRate = 9600;
_port2.Parity = Parity.None;
_port2.DataBits = 8;
_port2.StopBits = StopBits.One;
_port2.DataReceived += DoorPortDataReceivedHandler;
_port2.ReadTimeout = 2000;
if (!_port2.IsOpen)
{
_port2.Open();
}
MessageBox.Show(@"Door Port is Ready", @"Information", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, @"Error", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
private void DoorPortDataReceivedHandler(object sender,
SerialDataReceivedEventArgs e)
{
var sp = (SerialPort) sender;
string indata = sp.ReadExisting();
CheckTheft(indata);
}
答案 0 :(得分:5)
发布模式代码正在运行"太快" - 不幸的是它在调试模式下工作,因为行为没有明确定义:ReadExisting并不意味着ReadEverythingEverToBeWritten。
[ReadExisting读取]所有立即可用的字节,基于编码,在SerialPort对象的流和输入缓冲区中。
改为考虑ReadLine / ReadTo,阻塞直到读取正确的终止序列。
string indata = sp.ReadTo("\r\n");
答案 1 :(得分:2)
串口将在收到数据字节时报告收到的数据。您不能确定它会在一个事件中向您发送“完整”值(如何知道消息是完整的?请记住,串行数据是一个字节流)。
您需要缓冲正在接收的数据,并确定何时有完整的消息。
仅供参考 - 这可能在调试模式下工作,因为您在该模式下放慢了应用程序的速度。