繁体   English   中英

你如何在C#中使用Serial.Write()一个整数值而不是那个Int的ASCII值

[英]How do you Serial.Write() an Integer value instead of the ASCII value of that Int in C#

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

我试图通过Serial.write发送字符串,当从控制器请求数据时,它可以填充当前字段。 我已将修改后的值作为Byte Byte从字节数组发送,使用convert.ToInt32,但似乎只能作为ASCII十进制值发送,我已经通过serial.print字段值在Arduino IDE串口窗口中确认。 在1990年代只用C语言完成了数据库编程,请原谅我的无知,我只是在学习。 下面是我作为字符串发送的最新版本,但是在执行字节数组时使用了公共bool ExCmd(字符串cmd)的butchered版本,然后注释掉字符串的部分。 一直试图解决两个星期,阅读和编​​码,但没有决心,任何帮助将不胜感激。

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

丢失Convert.ToString()调用并且只是强制转换。 如果转换为char ,则可以继续使用字符串连接代码,但串口可能仍会误解它。

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


如果要进行二进制通信,那么与按位操作交朋友也很好。 例如,如果数字为负数, (val / 256)将执行符号扩展,从而弄乱您的数据流。 你想要的是(byte)(val >> 8)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM