• 3115阅读
  • 3回复

[提问]第一次碰到的报错 [复制链接]

上一主题 下一主题
离线harold00124
 

只看楼主 倒序阅读 楼主  发表于: 2016-11-29
不好意思小弟又来请教了
这次想实现的功能是开启程式后透过廻圈传递Define的值给程式
然后程式将值透过位元运算编译成我想要的资料格式 8个Byte的资料 然后再转成16进制的资料格式发送给机器
编译之后没有提示语法错误,小弟苦思费解还是找不出问题所在


报错
window.open('http://www.qtcn.org/bbs/attachment/Mon_1611/17_176460_4841afc9ac3d638.jpg?300');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >









文件资料转换部份我是copy刘大师的调试工具内的代码来用
头文件
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QString>
  5. #include <ctype.h>
  6. #define Gain_Dsp                0x0001
  7. #define Level_Dsp               0x0002
  8. #define Aux_Send_Dsp            0x0003
  9. #define Rev_Send_Dsp            0x0004
  10. #define Pan_Dsp                 0x0005
  11. #define Eq_Hi_Dsp               0x0006
  12. #define Eq_Hi_Freq_Dsp          0x0007
  13. #define Eq_Mid_Dsp              0x0008
  14. #define Eq_Mid_Freq_Dsp         0x0009
  15. #define Eq_Mid_Q_Dsp            0x000A
  16. #define Eq_Lo_Dsp               0x000B
  17. #define Eq_Lo_Freq_Dsp          0x000C
  18. #define Gate_Dsp                0x000D
  19. #define Gate_Threshold_Dsp      0x000E
  20. #define Gate_Release_Dsp        0x000F
  21. #define Comp_Dsp                0x0010
  22. #define Comp_Threshold_Dsp      0x0011
  23. #define Comp_Ratio_Dsp          0x0012
  24. #define Comp_Attack_Dsp         0x0013
  25. #define Comp_Release_Dsp        0x0014
  26. #define Delay_Dsp               0x0015
  27. #define Aux_Delay_Dsp           0x0016
  28. #define Solo_Dsp                0x0017
  29. #define Mute_Dsp                0x0018
  30. namespace Ui {
  31. class MainWindow;
  32. }
  33. class MainWindow : public QMainWindow
  34. {
  35.     Q_OBJECT
  36. public:
  37.     explicit MainWindow(QWidget *parent = 0);
  38.     ~MainWindow();
  39. public slots:
  40.     void Rxreaddate();//接收判別
  41.     void Gainwrite();//控件函式
  42.     WidthRead(int DspAddress);
  43.     //發送讀取請求編碼組成
  44.     static QString ChrtoHex(QString Dsp)
  45.     {
  46.             bool ok;
  47.             QString str;
  48.             int num=Dsp.toInt(&ok,16);
  49.             return str.setNum(num,16);
  50.     }
  51.     //16进制字符串转字节数组
  52.     static QByteArray HexStrToByteArray(QString str)
  53.     {
  54.         QByteArray senddata;
  55.         int hexdata,lowhexdata;
  56.         int hexdatalen = 0;
  57.         int len = str.length();
  58.         senddata.resize(len/2);
  59.         char lstr,hstr;
  60.         for(int i=0; i<len; )
  61.         {
  62.             hstr=str[i].toLatin1();
  63.             if(hstr == ' ')
  64.             {
  65.                 i++;
  66.                 continue;
  67.             }
  68.             i++;
  69.             if(i >= len)
  70.                 break;
  71.             lstr = str[i].toLatin1();
  72.             hexdata = ConvertHexChar(hstr);
  73.             lowhexdata = ConvertHexChar(lstr);
  74.             if((hexdata == 16) || (lowhexdata == 16))
  75.                 break;
  76.             else
  77.                 hexdata = hexdata*16+lowhexdata;
  78.             i++;
  79.             senddata[hexdatalen] = (char)hexdata;
  80.             hexdatalen++;
  81.         }
  82.         senddata.resize(hexdatalen);
  83.         return senddata;
  84.     }
  85.     static char ConvertHexChar(char ch)
  86.     {
  87.         if((ch >= '0') && (ch <= '9'))
  88.             return ch-0x30;
  89.         else if((ch >= 'A') && (ch <= 'F'))
  90.             return ch-'A'+10;
  91.         else if((ch >= 'a') && (ch <= 'f'))
  92.             return ch-'a'+10;
  93.         else return (-1);
  94.     }
  95.     //字节数组转16进制字符串
  96.     static QString ByteArrayToHexStr(QByteArray data)
  97.     {
  98.         QString temp="";
  99.         QString hex=data.toHex();
  100.         for (int i=0;i<hex.length();i=i+2)
  101.         {
  102.             temp+=hex.mid(i,2)+" ";
  103.         }
  104.         return temp.trimmed().toUpper();
  105.     }
  106.     //16进制字符串转10进制
  107.     static int StrHexToDecimal(QString strHex)
  108.     {
  109.         bool ok;
  110.         return strHex.toInt(&ok,16);
  111.     }
  112.     //10进制字符串转10进制
  113.     static int StrDecimalToDecimal(QString strDecimal)
  114.     {
  115.         bool ok;
  116.         return strDecimal.toInt(&ok,10);
  117.     }
  118.     //2进制字符串转10进制
  119.     static int StrBinToDecimal(QString strBin)
  120.     {
  121.         bool ok;
  122.         return strBin.toInt(&ok,2);
  123.     }
  124.     //16进制字符串转2进制字符串
  125.     static QString StrHexToStrBin(QString strHex)
  126.     {
  127.         uchar decimal=StrHexToDecimal(strHex);
  128.         QString bin=QString::number(decimal,2);
  129.         uchar len=bin.length();
  130.         if (len<8)
  131.         {
  132.             for (int i=0;i<8-len;i++)
  133.             {
  134.                 bin="0"+bin;
  135.             }
  136.         }
  137.         return bin;
  138.     }
  139.     //10进制转2进制字符串一个字节
  140.     static QString DecimalToStrBin1(int decimal)
  141.     {
  142.         QString bin=QString::number(decimal,2);
  143.         uchar len=bin.length();
  144.         if (len<=8)
  145.         {
  146.             for (int i=0;i<8-len;i++)
  147.             {
  148.                 bin="0"+bin;
  149.             }
  150.         }
  151.         return bin;
  152.     }
  153.     //10进制转2进制字符串两个字节
  154.     static QString DecimalToStrBin2(int decimal)
  155.     {
  156.         QString bin=QString::number(decimal,2);
  157.         uchar len=bin.length();
  158.         if (len<=16)
  159.         {
  160.             for (int i=0;i<16-len;i++)
  161.             {
  162.                 bin="0"+bin;
  163.             }
  164.         }
  165.         return bin;
  166.     }
  167.     //计算校验码
  168.     static uchar GetCheckCode(uchar data[],uchar len)
  169.     {
  170.         uchar temp=0;
  171.         for (uchar i=0;i<len;i++)
  172.         {
  173.             temp+=data[i];
  174.         }
  175.         return temp%256;
  176.     }
  177.     //将溢出的char转为正确的uchar
  178.     /*static uchar GetUChar(char data)
  179.     {
  180.         uchar temp;
  181.         if (data>127)
  182.         {
  183.             temp=data+256;
  184.         }
  185.         else
  186.         {
  187.             temp=data;
  188.         }
  189.         return temp;
  190.     }*/
  191. private:
  192.     Ui::MainWindow *ui;
  193. };
  194. #endif // MAINWINDOW_H



主文件
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtSerialPort/QSerialPort>
  4. #include <QSerialPortInfo>
  5. #include <QDebug>
  6. QSerialPort *Txserialport;
  7. QSerialPort *Rxserialport;
  8. MainWindow::MainWindow(QWidget *parent) :
  9.     QMainWindow(parent),
  10.     ui(new Ui::MainWindow)
  11. {
  12.     ui->setupUi(this);
  13.     Rxserialport=new QSerialPort(this);//讀取串口設置
  14.     Txserialport=new QSerialPort(this);//傳送串口設置
  15.     Rxserialport->setPortName("COM5");//接收串口名稱
  16.     Txserialport->setPortName("COM3");//讀取串口名稱
  17.     //傳輸環境設置
  18.     Rxserialport->open(QIODevice::ReadOnly);//唯獨
  19.     Txserialport->open(QIODevice::WriteOnly);//唯寫
  20.     Rxserialport->setBaudRate(QSerialPort::Baud115200);
  21.     Txserialport->setBaudRate(QSerialPort::Baud115200);
  22.     Rxserialport->setDataBits(QSerialPort::Data8);
  23.     Txserialport->setDataBits(QSerialPort::Data8);
  24.     Rxserialport->setParity(QSerialPort::SpaceParity);
  25.     Txserialport->setParity(QSerialPort::SpaceParity);
  26.     Rxserialport->setStopBits(QSerialPort::OneStop);
  27.     Txserialport->setStopBits(QSerialPort::OneStop);
  28.     //RX信號槽 只要RX收到信號就立即跳到RxReaddate副程式
  29.     connect(Rxserialport,SIGNAL(readyRead()),
  30.             this,SLOT(Rxreaddate()));
  31.     int Dsp[]={
  32.         Gain_Dsp,
  33.         Level_Dsp,
  34.         Aux_Send_Dsp,
  35.         Rev_Send_Dsp,
  36.         Pan_Dsp,
  37.         Eq_Hi_Dsp,
  38.         Eq_Hi_Freq_Dsp,
  39.         Eq_Mid_Dsp,
  40.         Eq_Mid_Freq_Dsp,
  41.         Eq_Mid_Q_Dsp,
  42.         Eq_Lo_Dsp,
  43.         Eq_Lo_Freq_Dsp,
  44.         Gate_Dsp,
  45.         Gate_Threshold_Dsp,
  46.         Gate_Release_Dsp,
  47.         Comp_Dsp,
  48.         Comp_Threshold_Dsp,
  49.         Comp_Ratio_Dsp,
  50.         Comp_Attack_Dsp,
  51.         Comp_Release_Dsp,
  52.         Delay_Dsp,
  53.         Aux_Delay_Dsp,
  54.         Solo_Dsp,
  55.         Mute_Dsp,
  56.     };
  57.     //開啟程式即發射請求訊號
  58.     for(int i=0;i<24;i++)
  59.     {
  60.         WidthRead(Dsp[i]);
  61.     }
  62.     //控件發送信號槽 每當控件數值出現變化就發送值到對應的函式
  63.     connect(ui->Gain_spinBox,SIGNAL(valueChanged(int)),
  64.             this,SLOT(Gainwrite()));
  65. }
  66. MainWindow::~MainWindow()
  67. {
  68.     delete ui;
  69.     Rxserialport->close();
  70.     Txserialport->close();
  71. }
  72. MainWindow::WidthRead(int DspAddress)
  73. {
  74.     int Product = 0x3F;
  75.     int Link_No = 0x1F;
  76.     int Write_Read =0x1;
  77.     int DSP_ID =0xF;
  78.     int Length=0xF;
  79.     int Pack_No=0x7F;
  80.     int DsPP[3];
  81.     DsPP[0]=DspAddress&0xF000;
  82.     DsPP[1]=DspAddress&0x0F00;
  83.     DsPP[2]=DspAddress&0x00F0;
  84.     DsPP[3]=DspAddress&0x000F;
  85.     int Ex1;
  86.     int Ex2;
  87.     int Ex3;
  88.     QString Strcode[7];
  89.     int WidthCode[7];
  90.     Ex1=Product<<2;
  91.     Ex2=Link_No>>3;
  92.     WidthCode[0]=(Ex1|Ex2)&0xFE;
  93.     Ex1=(Link_No&0xF)<<4;
  94.     Ex2=Write_Read<<3;
  95.     Ex3=DSP_ID>>2;
  96.     WidthCode[1]=(Ex1|Ex2|Ex3)&0xFE;
  97.     Ex1=(DSP_ID&0x7)<<5;
  98.     Ex2=DsPP[0]<<1;
  99.     WidthCode[2]=(Ex1|Ex2)&0xFE;
  100.     Ex1=DsPP[1]<<4;
  101.     WidthCode[3]=(Ex1|DsPP[2])&0xFE;
  102.     Ex1=(DsPP[2]&0x01)<<7;
  103.     Ex2=DsPP[3]<<3;
  104.     Ex3=Length>>1;
  105.     WidthCode[4]=(Ex1|Ex2|Ex3)&0xFE;
  106.     Ex1=(Length&0x3)<<6;
  107.     WidthCode[5]=Ex1&0xFE;
  108.     WidthCode[6]=Pack_No<<1;
  109.     WidthCode[7]=(WidthCode[0]^WidthCode[1]^WidthCode[2]^WidthCode[3]^WidthCode[4]^WidthCode[5]^WidthCode[6]^WidthCode[7])|0x01;
  110.     for(int i=0;i<8;i++){
  111.        Strcode[i]=QString::number(WidthCode[i]);
  112.        qDebug()<<Strcode[i];
  113.        Txserialport->write(HexStrToByteArray(Strcode[i]));
  114.        qDebug()<<HexStrToByteArray(Strcode[i]);
  115.        }
  116. }
  117. void MainWindow::Rxreaddate()//判斷收到的資料屬於哪個DSP位址並將值取出放入相對應的控件
  118. {
  119. }
  120. void MainWindow::Gainwrite()
  121. {
  122.     QString str =QString::number(ui->Gain_spinBox->value());
  123.     Txserialport->write(str.toStdString().data());
  124.     qDebug()<<str.toStdString().data();
  125. }



离线harold00124

只看该作者 1楼 发表于: 2016-11-29
小弟试了好久 把每段程式都遮罩起来一个一个Debug

发现好像是这段有问题


WidthCode[7]=(WidthCode[0]^WidthCode[1]^WidthCode[2]^WidthCode[3]^WidthCode[4]^WidthCode[5]^WidthCode[6]) | 0x01;

但是语法上没啥错误啊 搞不懂...
离线bran_lee

只看该作者 2楼 发表于: 2016-11-29
回 harold00124 的帖子
harold00124:小弟试了好久 把每段程式都遮罩起来一个一个Debug
发现好像是这段有问题
....... (2016-11-29 13:19) 

int WidthCode[7];
1条评分金钱+10
harold00124 金钱 +10 謝謝大大 我終於弄出來了 2016-11-29
当你只有锤子时,你看什么都像是钉子!
离线harold00124

只看该作者 3楼 发表于: 2016-11-29
感謝大大提點
改成這樣之後出來的值就是我要的了
  1. int Product = 0x3F;
  2.     int Link_No = 0x1F;
  3.     int Write_Read =0x1;
  4.     int DSP_ID =0xF;
  5.     int Length=0xF;
  6.     int Pack_No=0x7F;
  7.     int DsPP[4];
  8.     DsPP[0]=(DspAddress&0xF000)>>12;
  9.     DsPP[1]=(DspAddress&0x0F00)>>8;
  10.     DsPP[2]=(DspAddress&0x00F0)>>4;
  11.     DsPP[3]=DspAddress&0x000F;
  12.     int Ex1;
  13.     int Ex2;
  14.     int Ex3;
  15.     QString Strcode[8];
  16.     int WidthCode[8];
  17.     qDebug()<<"DspAddress:"<<DspAddress;
  18.     Ex1=Product<<2;
  19.     Ex2=Link_No>>3;
  20.     WidthCode[0]=(Ex1|Ex2)&0xFE;      //FE
  21.     qDebug()<<"Byte1:"<<WidthCode[0];
  22.     Ex1=(Link_No&0xF)<<4;
  23.     Ex2=Write_Read<<3;
  24.     Ex3=DSP_ID>>2;
  25.     WidthCode[1]=(Ex1|Ex2|Ex3)&0xFE;  //FA
  26.     qDebug()<<"Byte2:"<<WidthCode[1];
  27.     Ex1=(DSP_ID&0x7)<<5;
  28.     Ex2=DsPP[0]<<1;
  29.     WidthCode[2]=(Ex1|Ex2)&0xFE;      //E0
  30.     qDebug()<<"Byte3:"<<WidthCode[2];
  31.     Ex1=DsPP[1]<<4;
  32.     Ex2=DsPP[2];
  33.     WidthCode[3]=(Ex1|Ex2)&0xFE;        //0
  34.     qDebug()<<"Byte4:"<<WidthCode[3];
  35.     Ex1=(DsPP[2]&0x01)<<7;
  36.     Ex2=DsPP[3]<<3;
  37.     Ex3=Length>>1;
  38.     WidthCode[4]=(Ex1|Ex2|Ex3)&0xFE;    //e
  39.     qDebug()<<"Byte5:"<<WidthCode[4];
  40.     Ex1=(Length&0x03)<<6;
  41.     WidthCode[5]=Ex1&0xFE;              //c0
  42.     qDebug()<<"Byte6:"<<WidthCode[5];
  43.     Ex1=Pack_No<<1;
  44.     WidthCode[6]=Ex1&0xFE;              //Fe
  45.     qDebug()<<"Byte7:"<<WidthCode[6];
  46.     WidthCode[7]=(WidthCode[0]^WidthCode[1]^WidthCode[2]^WidthCode[3]^WidthCode[4]^WidthCode[5]^WidthCode[6]) | 0x01;
  47.     qDebug()<<"Byte8:"<<WidthCode[7];
  48.     for(int i=0;i<8;i++)
  49.     {
  50.         Strcode[i]=QString::number(WidthCode[i],16);
  51.         if((WidthCode[i]&0xF0)==0){
  52.             Strcode[i]="0"+Strcode[i];
  53.         }
  54.         qDebug()<<"Strcode:"<<i<<Strcode[i];
  55.         Txserialport->write(HexStrToByteArray(Strcode[i]));
  56.     }


快速回复
限100 字节
 
上一个 下一个