如何简化或重构这一点 [英] How to simplify or refactor this

查看:71
本文介绍了如何简化或重构这一点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个代码用于通过串口发送命令和值,但是我需要为100多个电机扩展它。

还有更好的方法吗?

这是我的代码到目前为止:



  private   void  sendBbutton_Click( object  sender,EventArgs e)
{
if (!comport.IsOpen)OpenPort();
comport.DiscardInBuffer();
sendList = new 列表< byte [] > ();
index = 0 ;
// 通讯字符串发送:< stx>< command>< group>< device> < value>< etx>
// < 02> < FF> < FF> < FF> < FFFF> < 03>
// Byte< 1> < 2 - ; < 3的密度; < 4是氢; < 5个< 6>
// stx = start
< span class =code-comment> // 命令move = 1,home = 2
// group 1 = motor 1& 2,2 =电机,全部= FF
// 设备1 =第一个控制器,2 =秒,全部= FF;
// etx end
if (!string.IsNullOrEmpty(motor1textBox.Text)&&!string.IsNullOrEmpty(motor2textBox.Text)
&&!string。 IsNullOrEmpty(motor3textBox.Text))
{
short motor1Value = Convert.ToInt16(motor1textBox.Text);
short motor2Value = Convert.ToInt16(motor2textBox.Text);
short motor3Value = Convert.ToInt16(motor3textBox.Text);
sendList = new 列表< byte [] > ();
byte [] motor1Byte = new byte [ 7 ];
byte [] motor2Byte = new byte [ 7 ];
byte [] motor3Byte = new byte [ 7 ];
motor1Byte [ 0 ] = stx;
motor2Byte [ 0 ] = stx;
motor3Byte [ 0 ] = stx;
motor1Byte [ 1 ] = 1 ;
motor2Byte [ 1 ] = 1 ;
motor3Byte [ 1 ] = 1 ;
motor1Byte [ 2 ] = 1 ;
motor2Byte [ 2 ] = 2 ;
motor3Byte [ 2 ] = 3 ;
motor1Byte [ 3 ] = 1 ;
motor2Byte [ 3 ] = 1 ;
motor3Byte [ 3 ] = 2 ;
motor1Byte [ 4 ] = ConvertIntToByteArray(motor1Value)[ 0 ];
motor2Byte [ 4 ] = ConvertIntToByteArray(motor2Value)[ 0 ];
motor3Byte [ 4 ] = ConvertIntToByteArray(motor3Value)[ 0 ];
motor1Byte [ 5 ] = ConvertIntToByteArray(motor1Value)[ 1 ];
motor2Byte [ 5 ] = ConvertIntToByteArray(motor2Value)[ 1 ];
motor3Byte [ 5 ] = ConvertIntToByteArray(motor3Value)[ 1 ];
motor1Byte [ 6 ] = etx;
motor2Byte [ 6 ] = etx;
motor3Byte [ 6 ] = etx;
sendList.Add(motor1Byte);
sendList.Add(motor2Byte);
sendList.Add(motor3Byte);

sendData(index);


}
}





谢谢,

Groover

解决方案

至少有一个数组或电机集合,而不是使用单个变量,这真的很难看。例如:

  byte  [] [] motorData; 

// ..

motorData = new byte [] [motorCount];
motorData = new byte [motorCount] [];
for int motor = 0 ; motor < motorCount; ++ motor)
motorData [motor] = new byte [ / * ... * / ]; // 这样,您可以为不同的电机提供单独的数据大小





如果所有电机的数据大小相同,则更简单:

  byte  [,] motorData; 

// ...

motorData = new byte [motorCount,dataLength];
// ...



非常相似的方法是收藏品,当然,通用。请参阅 http://msdn.microsoft.com/en-us/library/system。 collections.generic.aspx [ ^ ]。



-SA


这是我的解决方案,仍然必须用接收控制器测试它,但在调试它看起来没问题;





  private   void  sendBbutton_Click( object  sender,EventArgs e) 
{
if (!comport.IsOpen)OpenPort();
comport.DiscardInBuffer();
sendList = new 列表< byte [] > ();
index = 0 ;
// 通讯字符串发送:< stx> <命令> <组> <元件> <值GT; < etx>
// < 02> < FF> < FF> < FF> < FFFF> < 03>
// Byte< [0]> < [1]> < [2]> < [3]> < [4] [5]>< [6]>
// stx = start
// 命令move = 1,home = 2,move 1 cw = 3,移动1 acw = 4,移动多个cw = 5,
// 移动很多cw = 5,移动很多acw = 5,
// group 1 = motor 1 &安培; 2,2 =电机,全部= FF
// 设备1 =第一个控制器,2 =秒,全部= FF;
// etx end
if (!string.IsNullOrEmpty(motor1textBox.Text)&&!string.IsNullOrEmpty(motor2textBox.Text)
&&!string。 IsNullOrEmpty(motor3textBox.Text))
{
motorValuesList [ 0 ] = Convert.ToInt16(motor1textBox.Text);
motorValuesList [ 1 ] = Convert.ToInt16(motor2textBox.Text);
motorValuesList [ 2 ] = Convert.ToInt16(motor3textBox.Text);
for int i = 3 ; i < motorValuesList.Count; i ++) // 仅用于测试!
{
motorValuesList [i] = motorValuesList [ 2 ];
}
sendList = new 列表< byte [] > ();
for int motor = 0 ; motor < motorList.Count; motor ++)
{
motorList [motor] [ 0 ] = stx;
motorList [motor] [ 1 ] = 1 ;
motorList [motor] [ 2 ] =( byte )motor;
motorList [motor] [ 3 ] = 1 ;
motorList [motor] [ 4 ] = ConvertIntToByteArray(motorValuesList [motor])[ 0 ] ;
motorList [motor] [ 5 ] = ConvertIntToByteArray(motorValuesList [motor])[ 1 ] ;
motorList [motor] [ 6 ] = etx;
}
for int motorNr = 0 ; motorNr < motorList.Count; ++ motorNr)
{
sendList.Add(motorList [motorNr] );
}

sendData(index);
}
}
< / ffff > < / ff > < / ff > < / ff > < / etx > < / value > < / device > < / group > < / 命令 > < / stx >


I have this code for sending commands and values over serial, but I need to expand it for 100+ motors.
Is there a better way?
This is my code so far:

private void sendBbutton_Click(object sender, EventArgs e)
        {
            if (!comport.IsOpen) OpenPort();
            comport.DiscardInBuffer();
            sendList = new List<byte[]>();
            index = 0;
            // Communication string send: <stx><command><group><device><value><etx>
            //                            <02> <FF>     <FF>   <FF>    <FFFF> <03>
            // Byte                       <1>  <2>      <3>    <4>     <5>    <6>
            // stx = start 
            // command move = 1, home=2
            // group 1 = motor 1 & 2, 2 = motor , all = FF
            // device 1 = first controler, 2 = second, all = FF;
            // etx end  
            if (!string.IsNullOrEmpty(motor1textBox.Text) && !string.IsNullOrEmpty(motor2textBox.Text)
                && !string.IsNullOrEmpty(motor3textBox.Text))
            {
                short motor1Value = Convert.ToInt16(motor1textBox.Text);
                short motor2Value = Convert.ToInt16(motor2textBox.Text);
                short motor3Value = Convert.ToInt16(motor3textBox.Text);
                sendList = new List<byte[]>();
                byte[] motor1Byte = new byte[7];
                byte[] motor2Byte = new byte[7];
                byte[] motor3Byte = new byte[7];
                motor1Byte[0] = stx;
                motor2Byte[0] = stx;
                motor3Byte[0] = stx;
                motor1Byte[1] = 1;
                motor2Byte[1] = 1;
                motor3Byte[1] = 1;
                motor1Byte[2] = 1;
                motor2Byte[2] = 2;
                motor3Byte[2] = 3;
                motor1Byte[3] = 1;
                motor2Byte[3] = 1;
                motor3Byte[3] = 2;
                motor1Byte[4] = ConvertIntToByteArray(motor1Value)[0];
                motor2Byte[4] = ConvertIntToByteArray(motor2Value)[0];
                motor3Byte[4] = ConvertIntToByteArray(motor3Value)[0];
                motor1Byte[5] = ConvertIntToByteArray(motor1Value)[1];
                motor2Byte[5] = ConvertIntToByteArray(motor2Value)[1];
                motor3Byte[5] = ConvertIntToByteArray(motor3Value)[1];
                motor1Byte[6] = etx;
                motor2Byte[6] = etx;
                motor3Byte[6] = etx;
                sendList.Add(motor1Byte);
                sendList.Add(motor2Byte);
                sendList.Add(motor3Byte);

                sendData(index);


            }
        }



Thanks,
Groover

解决方案

At least have an array or collection of motors, instead of using individual variables, which is really ugly. For example:

byte[][] motorData;

//..

motorData = new byte[][motorCount];
motorData = new byte[motorCount][];
for (int motor = 0; motor < motorCount; ++motor)
    motorData[motor] = new byte[ /* ... */ ]; // this way, you could have individual sizes of data for different motors



If all motors have the same size of data, it's simpler:

byte[,] motorData;

//...

motorData = new byte[motorCount, dataLength];
// ...


Very similar approach would be with collections, of course, generic. Please see http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx[^].

—SA


Here is my solution, still have to test it with the receiving controler, but in debug it looks OK;


private void sendBbutton_Click(object sender, EventArgs e)
        {
            if (!comport.IsOpen) OpenPort();
            comport.DiscardInBuffer();
            sendList = new List<byte[]>();
            index = 0;
            // Communication string send: <stx> <command> <group> <device> <value> <etx>
            //                            <02>  <ff>      <ff>    <ff>     <ffff>  <03>
            // Byte                       <[0]> <[1]>     <[2]>   <[3]>    <[4][5]><[6] >
            // stx = start 
            // command move = 1, home = 2, move 1 cw = 3, move 1 acw = 4, move many cw = 5,
            //         move many cw = 5, move many acw = 5,
            // group 1 = motor 1 & 2, 2 = motor , all = FF
            // device 1 = first controler, 2 = second, all = FF;
            // etx end  
            if (!string.IsNullOrEmpty(motor1textBox.Text) && !string.IsNullOrEmpty(motor2textBox.Text)
                && !string.IsNullOrEmpty(motor3textBox.Text))
            {
                motorValuesList[0] = Convert.ToInt16(motor1textBox.Text);
                motorValuesList[1] = Convert.ToInt16(motor2textBox.Text);
                motorValuesList[2] = Convert.ToInt16(motor3textBox.Text);
                for (int i = 3; i < motorValuesList.Count; i++)      // for testing only!
                {
                    motorValuesList[i] = motorValuesList[2];
                }
                sendList = new List<byte[]>();
                for (int motor = 0; motor < motorList.Count; motor++)
                {
                    motorList[motor][0] = stx;
                    motorList[motor][1] = 1;
                    motorList[motor][2] = (byte)motor;
                    motorList[motor][3] = 1;
                    motorList[motor][4] = ConvertIntToByteArray(motorValuesList[motor])[0];
                    motorList[motor][5] = ConvertIntToByteArray(motorValuesList[motor])[1];
                    motorList[motor][6] = etx;
                }
                for (int motorNr = 0; motorNr < motorList.Count; ++motorNr)
                {
                    sendList.Add(motorList[motorNr]);
                }

                sendData(index);
            }
        }
</ffff></ff></ff></ff></etx></value></device></group></command></stx>


这篇关于如何简化或重构这一点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆