【问题标题】:C# splits the Payload when sending a byte array with Serial PortC# 使用串行端口发送字节数组时拆分有效负载
【发布时间】:2017-05-19 20:32:32
【问题描述】:

我目前正在尝试向通过 USB 端口连接的微芯片发送一个 64 字节长的命令。我尝试使用SerialPort.Write 命令发送一个字节数组,但发现它实际上将有效负载拆分为 16 个字节的数据包,分别发送这些数据包,中间有空的 NAK。我的代码如下:

SerialPort Chip = new SerialPort("COM4");
byte[] Reset = new byte[64];
byte[] Command = new byte[64];
Reset[0] = 0x70;
Reset[1] = 0xAB;
Reset[2] = 0xCD;
Reset[3] = 0xEF;
for (int z = 4; z < 64; z++)
{
    Reset[z] = 0x00;
}
for (int z = 0; z < 64; z++)
{
    Command[z] = 0x00;
}
Command[0] = 0x60;
Command[7] = 0x80;
Command[8] = 0x02;
Command[9] = 0x03;
Command[10] = 0x10;
Command[11] = 0x01;
Chip.Open();
Chip.Write(Reset,0,64);
Thread.Sleep(25);
Chip.Write(Command,0,64);

有谁知道用一个数据包发送我的命令的方法吗?
此外,当我尝试使用名为 HTerm 的程序发送 64 字节命令时也会发生同样的情况,而其他人用 C++ 编写的程序似乎工作得很好,但我对 C++ 的了解很少,所以这对我没有帮助.

【问题讨论】:

  • 您应该为 SerialPort 指定 BaudRate、Parity、DataBits、StopBits、Handshake 与设备上设置的相同
  • 设备使用 9600 的波特率,8 个数据位,1 个停止位,并且没有握手,这是默认设置。
  • 你熟悉串口吗?你试过发送字符串吗
  • 我试过发送字符串,情况还是一样。
  • 您使用什么方法来读取/检查结果?你在用一些成熟的工具吗?

标签: c# arrays serial-port usb


【解决方案1】:

这是我用于发送字节数组的应用程序:

bytesToSend = new byte[6]
                {
                    0, 5, 0,1, 13,10
                };

                _spManager.sendData(bytesToSend);

sendData 函数:

 public void sendData(byte[] bytestosend)
        {
          _serialPort.Open();
            StartListening();
            _serialPort.Write(bytestosend, 0, bytestosend.Length);

           System.Threading.Thread.Sleep(500);
        }

我还有一个函数允许将十六进制的东西(从文本框)转换为字节(以防我有一个改变的命令(所以一个没有预定义长度的数组):

var bytes = tbInput.Text.Split(' ').Select(h => byte.Parse(h, NumberStyles.AllowHexSpecifier)).ToArray();


                _spManager.sendData(bytes);

StartListening()

            /// <summary>
            /// Connects to a serial port defined through the current settings
            /// </summary>
            public void StartListening()
            {
                // Closing serial port if it is open
                if (_serialPort != null && _serialPort.IsOpen)
                        _serialPort.Close();

            // Setting serial port settings
            _serialPort = new SerialPort(
                _currentSerialSettings.PortName,
                _currentSerialSettings.BaudRate,
                _currentSerialSettings.Parity,
                _currentSerialSettings.DataBits,
                _currentSerialSettings.StopBits);

            // Subscribe to event and open serial port for data
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
            _serialPort.Open();
        }

【讨论】:

  • 我看不出这有什么帮助,它只是使用相同的写入函数,而且您还没有指定 StartListening 函数的作用。
  • 编辑函数或改变某个函数的工作方式对编程世界很有帮助
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多