C# 串行端口c接收到的额外字节3F#

C# 串行端口c接收到的额外字节3F#,c#,C#,我正在做一个项目,这意味着PIC18F4610通过Zigbee无线UART与带有无线Zigbee模块的USB串行端口进行通信。当我按下PIC上的按钮时,它会将一个10字节的数据包(字节)无线发送到USB端口上的另一个Zigbee模块。 它发送的数据包是0A 01 80 90 A0 B0 C0 D0 E0 F0。 如果我在PC上使用任何终端程序,比如RealTerm,我会得到发送的字节数据包。 然而,在我的程序中,我得到(通常)以下数据包:3F 3F 0A 01 80 90 A0 B0 C0 D0

我正在做一个项目,这意味着PIC18F4610通过Zigbee无线UART与带有无线Zigbee模块的USB串行端口进行通信。当我按下PIC上的按钮时,它会将一个10字节的数据包(字节)无线发送到USB端口上的另一个Zigbee模块。 它发送的数据包是0A 01 80 90 A0 B0 C0 D0 E0 F0。 如果我在PC上使用任何终端程序,比如RealTerm,我会得到发送的字节数据包。 然而,在我的程序中,我得到(通常)以下数据包:3F 3F 0A 01 80 90 A0 B0 C0 D0 E0 F0,其中包括发送的不良数据包,但在开始时有两个3F(即,12个字节,而不是发送的10个字节)。我可以通过程序来克服这一点,但有时它只在开始时放置一个3F,而其他的则在数据包项目之间滑动一个3F。没有数据包项目丢失,通常在开始时,只在这里和那里添加了3F(只有一个或两个)。 我已经检查了3F编码,当一个字符没有找到进行编码,但它似乎没有问题,因为它确实收到F0,例如。 串行端口在接收发送的数据包时打开。它的配置:

ST.puertoserie.PortName = "COM1";
ST.puertoserie.BaudRate = 9600;
ST.puertoserie.Parity = (Parity) 1;
ST.puertoserie.DataBits = 8;
ST.puertoserie.StopBits = (StopBits) 1;
ST.puertoserie.Encoding = System.Text.Encoding.GetEncoding(28591);
DataReceived事件处理程序已定义,并在serialport接收字节时激发

    ST.puertoserie.DataReceived += new SerialDataReceivedEventHandler(RecepcionBytePuertoSerie);
事件处理程序过程(ST是我拥有的一个全局类,包括一些变量和serialport):

private void RecepcionBytePuertoSerie(对象发送方,SerialDataReceivedEventArgs e)
{
而(ST.puertoserie.BytesToRead>0){
ST.rxcadena[ST.rxindex]=(字节)ST.puertoserie.ReadByte();
ST.rxindex++;
}
字节[]kprueba=新字节[ST.rxindex];
对于(int t=0;t
关于为什么会发生这种情况有什么线索吗?我试过各种方法,但没有办法。终端仿真器接收正确。必须有一些潜在的原因在程序中,等等,使这发生。现在这个程序只做了一个简单的形式,直到我可以得到串行通信工作。无线似乎没有问题(隐藏代码或任何东西),因为终端仿真器准确地接收PIC发送的内容。Windows似乎也不是问题所在,因为终端仿真器接收正确。 有什么线索/帮助吗?
保罗谢谢你的回答

现在,我已经实际桥接了串行端口的Tx和Rx引脚。 程序运行正常。完美的我将在对USB到串行设备执行相同操作时进行更新。应该可以。如果是这样的话,我将把注意力转移到无线UART设备上,它对于Realterm来说工作得非常完美,但是对于C#奇怪的字节(3F)开始出现。将更新,因为除了周末,我没有太多时间。现在我已经实现了对正常工作的数据包的CRC16检查。 为什么没有正确编程serialport类的人?还是事后改正? 另一方面,如果我写了一个协议,不使用
DataReceived
BytesToRead
,我将不得不创建固定长度的数据包,因为我不知道何时接收完数据,因为我不能确定数据中可能代表数据包结尾的代码可能已损坏和/或永远不会到达。必须考虑到我正在接收尚未真正发送的“ghost”字节。此外,数据包可能被截断,无法接收所有数据包,线程将无休止地等待。现在必须考虑一下。
将更新更多信息(很可能是问题,而不是解决方案)。

在使用串行RS232协议与设备通信时,我也遇到了类似的问题。我的软件(使用System.IO.Ports用C#编写)也在收到的消息中引入了3F(ASCII=“?”)。我通过使用与设备所需相同的端口配置(奇偶校验、停止位等)解决了这个问题。我的问题是我使用的是serialPort.Parity=Parity.偶数,而不是Parity.None(正如设备所要求的那样)

在其他论坛上(似乎是一个经常遇到的问题),它说问题在于c#SerialPort类使用的编码。
对我来说没有帮助,但是看看这个链接,也许它对你有帮助:

它确实像编码问题一样大声嘎嘎作响,但代码片段无法解释它。通过修复此代码中的可见错误,获得成功。您必须删除DiscardInBuffer()调用,它会随机丢弃数据。而ST.rxindex=0赋值需要正确完成,现在它的工作完全是偶然的。通过计算字节数或采用允许您始终检测消息的开始和结束的协议来实现这一点。NET
SerialPort
类是我曾经使用过的类之一。有时它工作,有时不工作-一些设备与之合作,其他设备则不合作。我不止一次不得不放弃它,转而采用另一种解决方案。可能是您的实现有问题,但我个人认为,
SerialPort
类不再让它有任何疑问。至少,根据上面的链接,尝试重写以避免使用
DataReceived
事件和
BytesToRead
属性。在必须使用
SerialPort
类的情况下,最好将所有处理放在自己的线程中,并运行一个循环,以便在该线程上同步地为端口提供服务。这可以让您绕过.NET类中最糟糕的部分。
private void RecepcionBytePuertoSerie(object sender, SerialDataReceivedEventArgs e)
 {
     while(ST.puertoserie.BytesToRead > 0) {
     ST.rxcadena[ST.rxindex] = (byte) ST.puertoserie.ReadByte(); 
     ST.rxindex++; 
  }

   byte[] kprueba = new byte[ST.rxindex];
   for (int t = 0; t < ST.rxindex; t++) { kprueba[t] = ST.rxcadena[t]; }
   MessageBox.Show(BitConverter.ToString(kprueba).Replace("-", " "));   // Display bytes in message box
   ST.rxindex = 0; 
   ST.puertoserie.DiscardInBuffer(); 
 }