如何在C#中Serial.Write()一个Integer值而不是该Int的ASCII值

时间:2019-05-15 12:47:02

标签: c# arduino

我正在用C#开发一个实用程序,以调整Arduino Mega的参数,该参数被用作最多3个电机的电机控制器。数据必须由电动机控制器接收,例如如[D2100] [=起始字节,D =要修改的参数,2 =是256(0-3)的乘数,100 =乘法结果(0-255)的余数必须保持<1024, ] =结束字节。数值作为十进制ASCII值(48-51)传递。

我试图通过Serial.write作为字符串发送,该字符串在从控制器请求数据时可以工作,因为我可以填充当前字段。我已将已修改的值从字节数组以字节接字节的形式发送,使用convert.ToInt32,但似乎只能以ASCII十进制值发送,这是我在Arduino IDE串行窗口中通过serial.print确认的字段值。请回过头来了解一下我的无知,我只是在学习1990年代的C语言中的数据库编程。下面是我作为字符串发送的最新版本,但是在处理字节数组时使用了公共布尔ExCmd(string cmd)的屠宰版本,然后注释掉了该字符串的各个部分。经过两个星期的尝试解决,阅读和编​​码但没有解决方法,我们将不胜感激。

private void SlKp_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {

            if (!initLoad)
            {
                string cmdChar = "";
                int val = Convert.ToInt32(slKp.Value);
                if (enaMotor == 1)
                {
                    cmdChar = "D";
                }
                if (enaMotor == 2)
                {
                    cmdChar = "E";
                }
                if (enaMotor == 3)
                {
                    cmdChar = "F";
                }
                string val1 = Convert.ToString(val / 256);
                string val2 = Convert.ToString(val % 256);
                string cmd = '['+ cmdChar + val1 + val2 +']' ;
                if (spHandler.ExCmd(cmd))
                {
                    fieldChanged = true;
                    btSave.IsEnabled = true;
                }
            }

        }
   public bool ExCmd(string cmd)
        {
            try
            {
                if (_serialPort != null && _serialPort.IsOpen)
                {
                    _serialPort.DiscardOutBuffer();
                    _serialPort.DiscardInBuffer();
                    _receiveNow.Reset();

                    /*int intCount = 0;
                    int intChar = cmd[intCount];
                    if (intChar == 0b1011011)  //91 [ bracket is start byte
                    {                      
                        do
                        {*/
                            _serialPort.Write(cmd); //intCount,1);
                         /*   if (cmd[intCount] != 0b1011101)
                            {
                                intCount++;
                            }

                        } while (cmd[intCount] != 0b1011101 && intCount < 4); //93 ] backet is end byte
                        if(cmd[intCount] == 0b1011101)
                        {*/
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }/*
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }*/
            catch
            {
                return false;
            }
        }

Arduino Code

       case 'D':
#ifdef MOTOR_1           
            Mtr1.lKp_x100=(RxBuffer[1]*256)+RxBuffer[2];
#endif

1 个答案:

答案 0 :(得分:0)

丢掉Convert.ToString()通话,然后进行投射。如果您强制转换为char,则可以继续使用字符串连接代码,但是串行端口仍可能会误解它。

处理二进制数据时,您真正想要的是一个字节数组。这就是串行端口读写的本机数据结构。所有的字符串便捷功能都假设Unicode具有特定的编码,仅对文本有意义。


如果您要进行二进制通信,也可以按位操作结交朋友。例如,如果数字为负,(val / 256)将进行符号扩展,从而使数据流混乱。您想要的是(byte)(val >> 8)