我正在制作一个项目,该项目意味着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(即十二个字节而不是十个字节) )。我可以通过程序克服这一点,但有时它仅在开头放置一个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事件处理程序,并在接收到串行端口上的字节时触发。
ST.puertoserie.DataReceived += new SerialDataReceivedEventHandler(RecepcionBytePuertoSerie);
事件处理程序过程(ST是我拥有的全局类,包括一些变量和串行端口):
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();
}
关于为什么发生这种情况的任何线索?我尝试过各种方法,但是没有办法。终端仿真器正确接收。在程序中必须有一些潜在的原因,等等。现在,程序只能以简单的形式执行此操作,直到我可以进行串行通信为止。无线似乎没有问题(隐藏的代码或任何东西),因为终端仿真器完全接收PIC发送的内容。 Windows似乎也不是问题所在,因为终端仿真器可以正确接收。 有任何线索/帮助吗? 保罗
答案 0 :(得分:0)
谢谢您的回答。
现在,我已经物理连接了串行端口的Tx和Rx引脚。
该程序运行正常。完善。我将在对USB到串行设备进行相同操作时进行更新。应该可以。如果是这样,我将继续使用无线UART设备,该设备对于Realterm来说是完美的,但是对于C#,奇怪的字节(3F)开始出现。会更新,因为除了周末我没有太多时间。现在,我已经实现了可以正常工作的数据包的CRC16检查。
为什么任何人都不能正确编程serialport类?还是以后改正?
另一方面,如果我写出不使用DataReceived
或BytesToRead
的协议,我将不得不创建固定长度的数据包,因为我不知道何时完成接收数据,因为我不能确保可能代表数据包结尾的数据中的代码可能已损坏和/或永远不会到达。必须考虑到我正在接收尚未真正发送的“鬼”字节。此外,数据包可能会被截断并且无法接收到所有数据包,并且线程将无限期等待。现在必须考虑一下。
我会继续进行更新(可能是问题,而不是解决方案)。
答案 1 :(得分:0)
在使用串行RS232协议与设备通信时,我也遇到了非常相似的问题。我的软件(使用System.IO.Ports用C#编写)还在收到的消息中引入了3F(ASCII =“?”)。我通过使端口配置(奇偶校验,StopBits等)与设备所需的端口相同来解决了该问题。我的问题是我正在使用serialPort.Parity = Parity.Even,而不是Parity.None(因为设备正在询问)。
在其他论坛上(似乎是一个经常遇到的问题),它说问题是c#SerialPort Class使用的编码。 对我来说没有帮助,但请看一下此链接,它可能会对您有所帮助:https://social.msdn.microsoft.com/Forums/en-US/efe127eb-b84b-4ae5-bd7c-a0283132f585/serial-port-sending-8-bit-problem?forum=Vsexpressvb