是这样的 我弄了一个编辑框关联一个CString变量 m_str; 这个编辑框内只需要输入数字和小数点。现在我想把这个数据加上一些十六进制的数据通过MSCOMM 以十六进制的格式发送出去。小弟在网络上试了很多方法都不能达到效果 特来此求助下。谢谢各位
解决方案 »
- 为什么要使用GlobalLock
- 文本框显示内容的换行问题
- 在程序运行过程中,请问如何改变静态文本框的风格?
- 求助!! 写的MFC软件在执行的时候出现异常错误。
- 怎么样才能将DLL版本编译成发行版本的
- CSDN论坛助手 重出江湖!!!!爽!爽!!爽!!知道什么是极速吗?快来体验一下了。[周一早8:00发布]
- this指针到底是如何工作的?请大虾指点
- VC菜鸟问题,请高手帮忙!
- VC2008下找不到component and control这个选项
- 我得到一个标准C的简单例程,可是在VC6中怎么也通不过连接,头疼!!!请帮忙!
- cryptopp与openssl的安全性。
- 急求MFC高手开发一个游戏模块5月29日前必须提交,100元,提供类似代码参考
UpdateData();
int n = 0;
if (m_com.GetPortOpen())
{
CString outdata = "",temp;
char indata[10];
unsigned char protocoldata[36];
strcpy(indata,(LPCTSTR)m_firststr);
protocoldata[0] = 0x0a;
protocoldata[1] = 0x7b;
protocoldata[2] = 0x00;
//protocoldata[3]
protocoldata[4] = 0x24;
protocoldata[5] = 0x00;
protocoldata[6] = 0x00;
protocoldata[7] = 0x00;
protocoldata[8] = 0x20;
protocoldata[9] = 0x00;
protocoldata[10] = 0x10;
protocoldata[11] = (unsigned char)m_check;
for (n = 0; n <= 10; n++)
{
protocoldata[n+12] = indata[n];
}
protocoldata[22] = 0x00;
protocoldata[23] = 0xff;
protocoldata[24] = ((unsigned char)m_flicker << 6) | 0x3f;
protocoldata[25] = ((unsigned char)m_function + 1);
protocoldata[26] = (unsigned char)m_key;
protocoldata[27] = 0x00;
protocoldata[28] = 0x00;
protocoldata[29] = 0x00;
protocoldata[30] = 0x00;
protocoldata[31] = (unsigned char)m_buzzer;
protocoldata[32] = (unsigned char)GetCheck(protocoldata);
protocoldata[33] = (unsigned char)(GetCheck(protocoldata) >> 8);
protocoldata[34] = 0x7d;
protocoldata[35] = 0x0b;
for(n = 0; n <= 35; n++)
{
temp.Format("%x",protocoldata[n]);
outdata += temp;
}
m_com.SetOutput(COleVariant(outdata));
}
else
{
MessageBox("请先打开相应的串口设备!");
}他最后输出是
61 37 62 30 63 63 32 34 30 30 30 32 30 30 31 30 31 33 31 33 32 33 33 33 34 33 35 33 36 33 37 33 38 30 63 63 30 66 66 37 66 32 30 30 30 30 30 30 37 35 30 37 64 62
感觉这个数据拆分掉了一样 又有点不象 !!哪位大侠能给点意见?
temp.Format("%x",protocoldata[n]); temp是CString类型,你这样格式化就是,把0X56,给格式化成了56,这样就变成了两个字符了你还是直接发送char 类型的数组,for(n = 0; n <= 35; n++)
{ m_com.SetOutput(COleVariant(protocoldata[n]));
}
另外
for(n = 0; n <= 35; n++)
{
temp.Format("%x",protocoldata[n]);
outdata += temp;
}这句话的意思是想实现什么??
2、拆分字符串为如此格式:"0x11" "0x12" 等
3、将拆分出的字符串转换为unsigned char型,可以使用atoi或strtol//16进制格式的字符串,转换使用如0x1E
unsigned char GHexStr2Int(const CHAR* pStr)
{
if(pStr == NULL )
{
return 0 ;
}
if(GDataIsHex(pStr) == FALSE )
{
return 0 ;
} return (unsigned char)strtol(pStr ,NULL ,16) ;
}
你那样的话好像是只能发送一个CHAR吧 那我如果想发送一个数组只能用FOR循环了吗?
回复:xianglitian
就象shen_wei所说的 0X56变成了5,6.
回复:ccpaishi
这句话的意思就是把一串数据CHAR的数据串成CString的字符串
我按照shen_wei说的去改成这样的话
for(n = 0; n <= 35; n++)
{
m_com.SetOutput(COleVariant(protocoldata[n]));
}
编译是没有问题 不过运行的时候提示 INVALID PROPERTY value这个是无效的属性值的意思吧!我protocoldata的类型是UNSIGNED CHAR
你说的数据拆分了,原因是你用了unsigned char 来处理,而非 char 来处理protocoldata[0] = 0x0a;
protocoldata[1] = 0x7b;这样写,内存里不是 0x0a,0x7b 而是 0x0a,0x00,0x7b,0x00,因为一个protocoldata 占2字节unsigned char protocoldata[36];这个改为 char 试一下吧.
然后楼主这个程序的结果,也是对的.
for(n = 0; n <= 35; n++)
{
temp.Format("%x",protocoldata[n]);
outdata += temp;
}
这个地方,把protocoldata的数挤在一起放.
看一下前面7个数
protocoldata[0] = 0x0a;
protocoldata[1] = 0x7b;
protocoldata[2] = 0x00;
//protocoldata[3]
protocoldata[4] = 0x24;
protocoldata[5] = 0x00;
protocoldata[6] = 0x00;
0x000a,0x007b,0x0000,0x00cc(第三个没赋值),0x0024,0x0000,0x0000
这些数在执行
temp.Format("%x",protocoldata[n]);
outdata += temp;
的时候,挤在了一起,变成了
第n 字节的 0 1 1 2 3 3 4 4 5 6
挤在一起后 a 7 b 0 c c 2 4 0 0
然后输出 61,37,62,00,63,63,32,34,00,00
全部都对应得上.
用unsigned char来处理会是 0x0a,0x00? 不会吧 应该是我用CString.Format的原因我现在是这样的 我有一串unsigned char的字符数组protocoldata[36],里面还有一些是0x00的数据。
我想通过MSCOMM控件发送出去 如果是0x12,发送出去就是0x12。我后来改了一下
用char来发送确实是可以 不过他一碰到0x00就停下来了 就认为字符串已经结束了。就不发送了 郁闷……
你那个事对应的上 可惜不是他把里面的字符都转化成ASCII码来发送了
MSCOMM 发的时候,先选BIN模式试试,不要选TEXT模式有0x00的东西,不要用字符串的函数来处理,因为他们遇到0x00就会不再管后面的东西了.
如果你的MSCOMM不行,要看看设置的地方了.
你的MSCOMM是怎么转化数据的呢?? 我用Serialport类也可以 用MSCOMM就是不行!!55~~
COleVariant myVar;
COleSafeArray safearray_inp;
BYTE byRxBuf;
myVar.Attach(GetInput());
safearray_inp = myVar;
m_byteArr.RemoveAll();
LONG index = 0;
//int iLen = safearray_inp.GetElemSize();
//int iLen = safearray_inp.GetDim();
int iLen = safearray_inp.GetOneDimSize();
for (index=0;index<iLen;index++)
{
safearray_inp.GetElement(&index,&byRxBuf);
m_byteArr.Add(byRxBuf);
}
这个代码,把数据取出来.用的是MSCOMM