应用场景:大恒光电的平移台 GCD-040101M
先看看要发什么东西
这是串口监听软件截取的结果,绿色的字
串口协议主要包括三个部分,前面是固定的,后面是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);
发现数据不对,不知道为什么不对
应该发这个
实际发了这个
位数对了,但是数据不对
错误版本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);
数据不对
正确版本
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);
另外
要加休眠
如果不加休眠
会变成这样,一次发送这么多
测试工具:串口监听和虚拟串口
(1条消息) 虚拟串口 VSPD 的使用_白杨木屋-CSDN博客_虚拟串口