2014-07-20 34 views
0

我想弄清楚为什么简单的RS232传输不起作用。如this图片所示,我正在运行一个调试器来查看要传输的数据值。问题是发送和接收的字节完全不同。我不知道这里有什么问题。如果有人需要更多信息,请让我知道。RS232传输包不匹配

下面是代码段:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO.Ports; 

namespace ShimmerAPI 
{ 
    class Transmission 
    { 
     const short multiplier = -1020; // 10000/-9.81 

     byte[] Combine (byte[] a0, byte[] a1, byte[] a2) 
     { 
      byte[] ret = new byte[a0.Length + a1.Length + a2.Length]; 
      Array.Copy(a0, 0, ret, 0, a0.Length); 
      Array.Copy(a1, 0, ret, a0.Length, a1.Length); 
      Array.Copy(a2, 0, ret, a0.Length + a1.Length, a2.Length); 
      return ret; 
     } 

     short Multiply (double x) 
     { 
      if (x > 25 || x < -25) 
       return 0; 
      else 
       return Convert.ToInt16(x * multiplier); 
     } 

     public void TransmitData (SerialPort port, ObjectCluster obj) 
     { 
      double[] data = obj.GetData().ToArray(); 

      short X = Multiply(data[3]); 
      short Y = Multiply(data[5]); 
      short Z = Multiply(data[7]); 

      byte[] combBytes = Combine(BitConverter.GetBytes(Z), BitConverter.GetBytes(Y), BitConverter.GetBytes(X)); 

      port.Write(combBytes, 0, 1); 
     } 
    } 
} 

screenshot of data capture and code

+0

多少字节你期望被传染? –

+0

6个字节,如右侧所列。看起来输出的大小并不是我期待的。之前的截图是当数据包被分组为单词时。 – geft

回答

1

第二和第三个参数SerialPort.Write指定数组发送的一部分;你的代码只发送一个字节,因为这就是你所要求的(第三个参数,count,设置为1)。

我不知道您的嗅探器中的其他字节是否来自于该索引0(即11)是该函数发送的唯一字节。

您可能意味着

port.Write(combBytes, 0, combBytes.Length); 
+0

其他字节在出现断点处的I F5时出现。虽然如果这是问题,我会觉得很愚蠢。我认为这是重复的次数... – geft

+0

你是对的,谢谢!虽然,我想知道[其他字节](http://i.imgur.com/DBnljuf.png)在那里做什么。它们是串行协议的一部分吗?我知道1和0是停止和开始字节,但是4? – geft

+0

@geft:我不知道你的协议是什么;这是你的设备。如果你问的是.NET SerialPort类还是Win32串行通信栈会自动添加额外的字节,答案是他们不会。有更高级别的协议,例如可以在串行端口上运行的打印或联网(PPP),但是可以通过其他API访问它们。 –