Qt 串口发送0x00

应用场景:大恒光电的平移台 GCD-040101M

先看看要发什么东西

这是串口监听软件截取的结果,绿色的字

Qt 串口发送0x00_第1张图片

串口协议主要包括三个部分,前面是固定的,后面是key ,后面是 0x00 最后面是数据。

 错误版本1

bool MoveStage::writeCmd(char key, unsigned int data_int)
{
   char * chars = new  char[10];
  chars[0]= 0x11;chars[1]= 0x11;chars[2]= 0x40;
  //addr
  chars[3]= 0x01;
  chars[4]= key;
  chars[5]= 0x00;
  //data
  char * data = (  char *)&data_int; 

  chars[6]= data[0];
  chars[7]= data[1]&0xff;
  chars[8]= data[2]&0xff;
  chars[9]= data[3]&0xff;
  printf("write:\n");
  for (int i = 0;i<10 ;i++){
    printf("  %x  ", chars[i]&0xff);
  }
  printf("\n");
  std::string cmd = chars;
  printf("  cmd.length() : %llu ", cmd.length());
  serial->write(cmd.c_str(), cmd.length());

  if (!serial->waitForReadyRead(100))
    return false;

  return true;

  return 1;
}

 cmd.length() 的值是5 只能发5个字节, 由于0x00的影响

错误版本2 

我们把serial->write(cmd.c_str(), cmd.length());  改成serial->write(cmd.c_str(), 10);

发现数据不对,不知道为什么不对

应该发这个

Qt 串口发送0x00_第2张图片

实际发了这个

Qt 串口发送0x00_第3张图片

位数对了,但是数据不对

错误版本3

bool MoveStage::writeCmd(char key, unsigned int data_int)
{
   char * chars = new  char[10];
  chars[0]= 0x11;chars[1]= 0x11;chars[2]= 0x40;
  //addr
  chars[3]= 0x01;
  chars[4]= key;
  //data
  char * data = (  char *)&data_int; //unsigned int data_int

  sprintf(chars+5,"%x",0x00);
  sprintf(chars+6,"%x",data[0]);
  sprintf(chars+7,"%x",data[1]);
  sprintf(chars+8,"%x",data[2]);
  sprintf(chars+9,"%x",data[3]);

  printf("write:\n");
  for (int i = 0;i<10 ;i++){
    printf("  %x  ", chars[i]&0xff);
  }
  printf("\n");
  std::string cmd = chars;
  printf("  cmd.length() : %llu ", cmd.length());
  serial->write(chars, 10);
  printf("\n");
  if (!serial->waitForReadyRead(100))
    return false;

  return true;

}

  使用这个 sprintf(chars+5,"%x",0x00);

  数据不对

Qt 串口发送0x00_第4张图片

Qt 串口发送0x00_第5张图片

正确版本

Qt 串口发送0x00_第6张图片

Qt 串口发送0x00_第7张图片

bool MoveStage::writeCmd(char key, unsigned int data_int)
{
    char * chars = new  char[10];
    chars[0]= 0x11;chars[1]= 0x11;chars[2]= 0x40;
    //addr
    chars[3]= 0x01;
    chars[4]= key;
    chars[5]= 0x00;
    //data
    char * data = (  char *)&data_int; //unsigned int data_int


    chars[6]= data[0];
    chars[7]= data[1];
    chars[8]= data[2];
    chars[9]= data[3];

     QByteArray array(chars, 10);
     printf("write:\n");
     for (int i = 0;iwrite(array);

    if (!serial->waitForReadyRead(100))
      return false;

    return true;

}

 使用这个  QByteArray array(chars, 10);

另外

要加休眠

Qt 串口发送0x00_第8张图片

如果不加休眠

Qt 串口发送0x00_第9张图片

会变成这样,一次发送这么多 

测试工具:串口监听和虚拟串口

(1条消息) 虚拟串口 VSPD 的使用_白杨木屋-CSDN博客_虚拟串口

你可能感兴趣的:(qt,qt,c++,串口通信)