vc MFC串口通信接收到的字符串中提起字符为什么无效

时间:2021-06-01 23:43:57
if(m_Comm.GetCommEvent()==2)        //接收缓冲区内有字符
  {
m_input1=m_Comm.GetInput();     //读取缓冲区内的数据
m_input2=m_input1;              //将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组

for(i=0;i<length;i++)           //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
if(m_hex.GetCheck())
str.Format("%X ",a);
else str.Format("%c",a);
m_ReceiveData+=str;
}
if(m_ReceiveData[0]=='7')//&&m_ReceiveData[length-1]==0xE
  biaozhi=1;//  当检查到字符串中第一个字符为7时,便使biaozhi”产生为1(以定义biaozhi为bool刑变量)
else biaozhi=0;
  
  }


请大侠指点一二!!!!!

13 个解决方案

#1


继续补充::
bool CCommDlg::biaozhi=0;

int Str2Hex(CString str,CByteArray &data);
char HexChar();
void CCommDlg::OnComm() 
{
if(stop)return;
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;

if(m_Comm.GetCommEvent()==2)        //接收缓冲区内有字符
  {
m_input1=m_Comm.GetInput();     //读取缓冲区内的数据
m_input2=m_input1;              //将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组

for(i=0;i<length;i++)           //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
if(m_hex.GetCheck())
str.Format("%X ",a);
else str.Format("%c",a);
m_ReceiveData+=str;
}
if(m_ReceiveData[0]=='7')//&&m_ReceiveData[length-1]==0xE
  biaozhi=1;
else biaozhi=0;
  
  }


     UpdateData(FALSE);//更新编辑框内容

 m_SendData="eb 90 eb 90 eb 90";
   if(biaozhi)
   {
   if(m_hexsend.GetCheck())
{
CByteArray data;
     int len=Str2Hex(m_SendData,data);
     m_Comm.SetOutput(COleVariant(data));//发送数据

   else m_Comm.SetOutput(COleVariant(m_SendData));//发送数据
   biaozhi=0;
   } 
   


在次补充一下,就是当发现接收到的字符串中第一个字符如果为“7”,则回复自动"eb 90 eb 90 eb 90";
实际运行结果发现没有回复,请大侠指点!!!!!!!!!!!我对m_ReceiveData不是很熟悉!!!!!!

#2


在次补充一下,就是当发现接收到的字符串中第一个字符如果为“7”,则自动回复"eb 90 eb 90 eb 90";
实际运行结果发现没有回复,请大侠指点!!!!!!!!!!!我对m_ReceiveData不是很熟悉!!!!!!

#3


LZ发错地方了
你的m_ReceiveData是定义为什么类型?CString类型?
那if(m_ReceiveData[0]=='7')是什么意思?
UCHAR*类型??
那“m_ReceiveData+=str;”又做何解释?
另外你的接受也很有问题,这两行代码:
str.Format("%X ",a);
else str.Format("%c",a);
按你后面的描述,应该是按字节接受的吧?如果接受的单个字符的话(else语句),那应该往前面填‘0’啊。
好,如果是CString类型,如果想知道第一个字符是‘7’,那应该这样:
if(m_ReceiveData.Left(1)=="7")
...

#4


要么:
if(m_ReceiveData.GetAt(0)=='7')
...

#5


4#的兄弟,谢谢指点,运用if(m_ReceiveData.GetAt(0)=='7'),达到效果。我要实现的问题是,对收到的数据进行判断,如果里面包含“2C(十六进制)”字符,那就要实现自动下发数据。希望高手指点怎样实现,谢谢!
第二个问题,另我做了如下修改,编译无问题。还望高手指点。
char a[100];
     UpdateData(FALSE);//更新编辑框内容
     {  sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
 if(a[2]==‘7’)//判断接受的字符串中是否含有“7”,有就自动发送。
这段代码运行发现,当a[0],a[1]时,可以实现判断,但是当a为3时就不行了,请高手指点!
小弟在此谢了!

#6


4#的兄弟,比如“EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E”中我要判断是否有“C2”,我用
if(m_ReceiveData.GetAt(14)=='C'&&m_ReceiveData.GetAt(15)=='2')为什么就不行了呢??但是为
if(m_ReceiveData.GetAt(1)=='C'&&m_ReceiveData.GetAt(2)=='2')又可以了呢???
还望指点啊,谢谢

#7


LZ,我很奇怪你为什么不定义个数组来保存接受的数据呢?为什么就一定要用个CString类型?
比如我定义:UCHAR m_ReceiveData[255];
那么你的for循环就可以改为:
for(i=0;i<length;i++) //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
//(m_hex.GetCheck()) //不好意思,你的m_hex定义什么类型的呢?我先把这句给注释掉
  m_ReceiveData[i] = a;//将数据都保存到数组中去
}
if( m_ReceiveData[0] == 0x07 )
  biaozhi = 1;
else
  biaozhi = 0;
/********************************************************************************/
因此如果要判断里面是否有0X2C的话,就好判断了吧?假设收到的数据有length个,那么:
for ( int j=0; j<length; j++)
 {
  if ( m_ReceiveData[i] == 0x2c )
   //进行相应处理就可以,比如你说的下发数据
 }

#8


第二个问题,另我做了如下修改,编译无问题。还望高手指点。
char a[100];
  UpdateData(FALSE);//更新编辑框内容
  { sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
 if(a[2]==‘7’)//判断接受的字符串中是否含有“7”,有就自动发送。
这段代码运行发现,当a[0],a[1]时,可以实现判断,但是当a为3时就不行了,请高手指点!
————————————————————————————————————————————
你的意思是不是要将收到的数据放到编辑框中显示?
直接这样就可:
假设编辑框关联的变量为:CString m_Show;
定义个变量: CString temp;
int Len;//Len为收到数据的个数
for (int Index=0; Index<Len; Index++)
 {
  temp.Format("%02x",m_ReceiveData[Index]);//之所以用%02x,是因为如果是单个数据,比如0x07,它就会显示为“07”,否则将为“7”;
   m_Show += temp;
 }
这样,你的编辑框就显示你收到的数据了,要判断这个CString类型的数据是否有什么你不想看到的数据,应该楼主会了吧?
另外我不知道你这句是什么意思:
{ sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
这样做不太好,你要判断是否有什么你不想看到的数据,直接从m_ReceiveData里进行判断就行了啊,何必又多此一举还要再编辑框里判断呢?
 

#9


另外对于GetAt的用法,建议你看看MSDN里的CString类,里面有具体介绍
CString::GetAt(int nIndex)
nIndex是从字符串的第一个位置算起的,从0开始计数,所以“EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E”里面的C2应该是21、22的位置,并且还保证每个数据间空格只有一格。如果要找C2的话,可以调用Find函数:
比如定义这个字符串为:
CString str(_T("EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E"));
if ( str.Find("C2") == -1 )
 //表示找到C2,然后进行相应处理

#10


谢谢你了,你的解释很清晰,很感谢你,终于可以发帖了,急死我了!
m_SendData.SetAt(7,m_ReceiveData.GetAt(0))这样行吗,高手请教啊!!
  m_SendData="EB 90 EB 90 0B 90 01 C2";
  char x='7';
  m_SendData.SetAt(7,x);
以上正确可以运行,但是如果改为这样,
m_SendData="EB 90 EB 90 0B 90 01 C2";
char X=m_ReceiveData.GetAt(0);
m_SendData.SetAt(7,X);  



m_SendData="EB 90 EB 90 0B 90 01 C2";
m_SendData.SetAt(7,m_ReceiveData.GetAt(0)); //m_ReceiveData为CString类,可是以上那样为什么错了呢????还望高手指点,怎样修改才好????

编译均通过,可是一接收数据就弹出错误对话框!!!!
我的想法就是从接收到的数据中某个位置上得到的数据填进要发送的数据中。谢谢!

#11


可爱的萧竹,可爱的妖哥,没钱发贴了,咋办哦

#12


回答者很认真啊 学习

#13


真心认为是好贴。。。。。。。。。

#1


继续补充::
bool CCommDlg::biaozhi=0;

int Str2Hex(CString str,CByteArray &data);
char HexChar();
void CCommDlg::OnComm() 
{
if(stop)return;
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;

if(m_Comm.GetCommEvent()==2)        //接收缓冲区内有字符
  {
m_input1=m_Comm.GetInput();     //读取缓冲区内的数据
m_input2=m_input1;              //将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组

for(i=0;i<length;i++)           //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
if(m_hex.GetCheck())
str.Format("%X ",a);
else str.Format("%c",a);
m_ReceiveData+=str;
}
if(m_ReceiveData[0]=='7')//&&m_ReceiveData[length-1]==0xE
  biaozhi=1;
else biaozhi=0;
  
  }


     UpdateData(FALSE);//更新编辑框内容

 m_SendData="eb 90 eb 90 eb 90";
   if(biaozhi)
   {
   if(m_hexsend.GetCheck())
{
CByteArray data;
     int len=Str2Hex(m_SendData,data);
     m_Comm.SetOutput(COleVariant(data));//发送数据

   else m_Comm.SetOutput(COleVariant(m_SendData));//发送数据
   biaozhi=0;
   } 
   


在次补充一下,就是当发现接收到的字符串中第一个字符如果为“7”,则回复自动"eb 90 eb 90 eb 90";
实际运行结果发现没有回复,请大侠指点!!!!!!!!!!!我对m_ReceiveData不是很熟悉!!!!!!

#2


在次补充一下,就是当发现接收到的字符串中第一个字符如果为“7”,则自动回复"eb 90 eb 90 eb 90";
实际运行结果发现没有回复,请大侠指点!!!!!!!!!!!我对m_ReceiveData不是很熟悉!!!!!!

#3


LZ发错地方了
你的m_ReceiveData是定义为什么类型?CString类型?
那if(m_ReceiveData[0]=='7')是什么意思?
UCHAR*类型??
那“m_ReceiveData+=str;”又做何解释?
另外你的接受也很有问题,这两行代码:
str.Format("%X ",a);
else str.Format("%c",a);
按你后面的描述,应该是按字节接受的吧?如果接受的单个字符的话(else语句),那应该往前面填‘0’啊。
好,如果是CString类型,如果想知道第一个字符是‘7’,那应该这样:
if(m_ReceiveData.Left(1)=="7")
...

#4


要么:
if(m_ReceiveData.GetAt(0)=='7')
...

#5


4#的兄弟,谢谢指点,运用if(m_ReceiveData.GetAt(0)=='7'),达到效果。我要实现的问题是,对收到的数据进行判断,如果里面包含“2C(十六进制)”字符,那就要实现自动下发数据。希望高手指点怎样实现,谢谢!
第二个问题,另我做了如下修改,编译无问题。还望高手指点。
char a[100];
     UpdateData(FALSE);//更新编辑框内容
     {  sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
 if(a[2]==‘7’)//判断接受的字符串中是否含有“7”,有就自动发送。
这段代码运行发现,当a[0],a[1]时,可以实现判断,但是当a为3时就不行了,请高手指点!
小弟在此谢了!

#6


4#的兄弟,比如“EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E”中我要判断是否有“C2”,我用
if(m_ReceiveData.GetAt(14)=='C'&&m_ReceiveData.GetAt(15)=='2')为什么就不行了呢??但是为
if(m_ReceiveData.GetAt(1)=='C'&&m_ReceiveData.GetAt(2)=='2')又可以了呢???
还望指点啊,谢谢

#7


LZ,我很奇怪你为什么不定义个数组来保存接受的数据呢?为什么就一定要用个CString类型?
比如我定义:UCHAR m_ReceiveData[255];
那么你的for循环就可以改为:
for(i=0;i<length;i++) //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
//(m_hex.GetCheck()) //不好意思,你的m_hex定义什么类型的呢?我先把这句给注释掉
  m_ReceiveData[i] = a;//将数据都保存到数组中去
}
if( m_ReceiveData[0] == 0x07 )
  biaozhi = 1;
else
  biaozhi = 0;
/********************************************************************************/
因此如果要判断里面是否有0X2C的话,就好判断了吧?假设收到的数据有length个,那么:
for ( int j=0; j<length; j++)
 {
  if ( m_ReceiveData[i] == 0x2c )
   //进行相应处理就可以,比如你说的下发数据
 }

#8


第二个问题,另我做了如下修改,编译无问题。还望高手指点。
char a[100];
  UpdateData(FALSE);//更新编辑框内容
  { sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
 if(a[2]==‘7’)//判断接受的字符串中是否含有“7”,有就自动发送。
这段代码运行发现,当a[0],a[1]时,可以实现判断,但是当a为3时就不行了,请高手指点!
————————————————————————————————————————————
你的意思是不是要将收到的数据放到编辑框中显示?
直接这样就可:
假设编辑框关联的变量为:CString m_Show;
定义个变量: CString temp;
int Len;//Len为收到数据的个数
for (int Index=0; Index<Len; Index++)
 {
  temp.Format("%02x",m_ReceiveData[Index]);//之所以用%02x,是因为如果是单个数据,比如0x07,它就会显示为“07”,否则将为“7”;
   m_Show += temp;
 }
这样,你的编辑框就显示你收到的数据了,要判断这个CString类型的数据是否有什么你不想看到的数据,应该楼主会了吧?
另外我不知道你这句是什么意思:
{ sscanf(m_ReceiveData,"%s",a); }//将编辑框中的m_ReceiveData数据转换为字符串付给a
这样做不太好,你要判断是否有什么你不想看到的数据,直接从m_ReceiveData里进行判断就行了啊,何必又多此一举还要再编辑框里判断呢?
 

#9


另外对于GetAt的用法,建议你看看MSDN里的CString类,里面有具体介绍
CString::GetAt(int nIndex)
nIndex是从字符串的第一个位置算起的,从0开始计数,所以“EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E”里面的C2应该是21、22的位置,并且还保证每个数据间空格只有一格。如果要找C2的话,可以调用Find函数:
比如定义这个字符串为:
CString str(_T("EB 90 EB 90 EB 90 01 C2 02 00 01 8A DC 7E"));
if ( str.Find("C2") == -1 )
 //表示找到C2,然后进行相应处理

#10


谢谢你了,你的解释很清晰,很感谢你,终于可以发帖了,急死我了!
m_SendData.SetAt(7,m_ReceiveData.GetAt(0))这样行吗,高手请教啊!!
  m_SendData="EB 90 EB 90 0B 90 01 C2";
  char x='7';
  m_SendData.SetAt(7,x);
以上正确可以运行,但是如果改为这样,
m_SendData="EB 90 EB 90 0B 90 01 C2";
char X=m_ReceiveData.GetAt(0);
m_SendData.SetAt(7,X);  



m_SendData="EB 90 EB 90 0B 90 01 C2";
m_SendData.SetAt(7,m_ReceiveData.GetAt(0)); //m_ReceiveData为CString类,可是以上那样为什么错了呢????还望高手指点,怎样修改才好????

编译均通过,可是一接收数据就弹出错误对话框!!!!
我的想法就是从接收到的数据中某个位置上得到的数据填进要发送的数据中。谢谢!

#11


可爱的萧竹,可爱的妖哥,没钱发贴了,咋办哦

#12


回答者很认真啊 学习

#13


真心认为是好贴。。。。。。。。。