上位机编写过程中怎么把CString里的数字转化为等价意义上的16进制
小弟根据书本依瓢画葫芦弄了个简单的串口通讯软件,悲剧的是都是发送CString的,比如我想发个字节到单片机,然后减去2,再返回给PC,那我发23,得到的就是01,发52,得到的就是30,也就是每个数字都减去2,唯一的解释就是CString发送的就是一个数字就是一个字节,一个两位数他就认为是两个字节,纠结了。哪位大侠指导下我在编辑框属性不变的情况下改动下数据处理函数呢,使得我发“23”(十进制),让他转为“17”(前面省略了0x)的16进制,然后再发出去呢,也就是转化为一个字节发出去,而且这个字节就代表了十六进制“0x17”,就像市面上一般的串口调试助手,以16进制发送一个数,单片机收到的就是个一个字节的十六进制数我的环境是C++,mfc,mscomm控件
http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630684ALHN01.png
(原文件名:msd_ad.png)
以下是两个比较重要的处理函数,发送函数和接受函数,
void CMsc_adDlg::OnBUTTONsendmsg()
{
// TODO: Add your control notification handler code here
//以下是发送按钮的消息函数
UpdateData(TRUE);//读编辑框内容
m_mycomm.SetOutput(COleVariant(m_send));//m_send是CString类型
}
这个是接收函数
void CMsc_adDlg::OnComm()
{
// TODO: Add your control notification handler code here
//以下是MSCOMM控件相应的消息函数代码
COleSafeArray safearray_inp; //定义一个COleSafeArray型的变量
VARIANT variant_inp; //定义一个VARIANT型的变量
LONG len,k; //定义辅助变量
BYTE rxdata; //定义一个字节数组
CString strtemp; //定义一个CString变量
if(m_mycomm.GetCommEvent()==2) //事件值为2时表示接收缓冲区内有字符
{
variant_inp=m_mycomm.GetInput(); //读缓冲区(缓冲区内容是VARIANT型,必须最终转化成CString类型)
safearray_inp=variant_inp; //VARIANT变量转化成COleSafeArray变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//COleSafeArray变量转化为BYTE型数组
for(k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata+k); // 数组一个元素转化为字符型
strtemp.Format("%c",bt); //转化好的一个字符送入临时变量strtemp存放
m_receivemsg+=strtemp; //加入对应的字符串变量m_receive中
}
UpdateData(FALSE); //更新编辑框内容
}
} 有个函数,字符串转INT 回复【1楼】fugeone
-----------------------------------------------------------------------
大侠能详细点吗 CString str="23";
int val=atoi(str);
val = 0x17 atoi 回复【3楼】fjh120
-----------------------------------------------------------------------
其实我想了想,我就是不明白怎么将23当做一个字节发出去,而不是两个字节, 回复【4楼】xiaosars
-----------------------------------------------------------------------
int val=atoi(str);
这步处理好后,我怎么把VAL发给串口让他发给单片机呢
m_mycomm.SetOutput(COleVariant(m_send));
m_send是int型的话编译会出错 汗。。转成十六进制还要再转回CString。。还真没想出怎么转。
没用过mscomm控件,你查下发送函数,看有没有直接能发十六进制数据的。
我用CSerialPort串口类挺好用的,数据发送比较类似于单片机的串口。如果不嫌麻烦我发给工程上来,你稍微改下就可以用了
我在用的直接发十六进制,供参考:
TxBuffer = 0x12;
TxBuffer = DEC2HEX(Hour);
TxBuffer = DEC2HEX(Minute);
TxBuffer = TxBuffer^TxBuffer^TxBuffer^TxBuffer;
m_SerialPort.WriteToPort(TxBuffer,5); 那麻烦大哥给我发下工程好吗,之前我也尝试着用过CSerialPort类写过,可是可能由于头文件一直找不到好的,所以一直出问题,所以回来用MSComm~~~我邮箱是871317392@qq.com http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630714UZTVV7.jpg
(原文件名:未命名.jpg)
点击此处下载 ourdev_630713SZPW5A.rar(文件大小:216K) (原文件名:COMM.rar) 回复【9楼】fjh120
-----------------------------------------------------------------------
怎么也下载不下来能烦请大侠发我一下邮箱好吗
不用发了,我下载下来了,好像挺好用的,我再仔细研究研究,谢谢大侠啊 回复【9楼】fjh120
-----------------------------------------------------------------------
大侠我再问下
void CSerialPort::WriteToPort(char* string,int n)
{
assert(m_hComm != 0);
memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
// memset(m_szWriteBuffer, 0, n);
// strncpy(m_szWriteBuffer, string, n);
memcpy(m_szWriteBuffer, string, n);
m_nWriteSize=n;
// set event for write
SetEvent(m_hWriteEvent);
这个函数的作用是不是就是发送string中的前n个字符?
这是您的代码 char TxBuffer;
UpdateData(TRUE); //读入编辑框中的数据
int val = atoi(m_send);
TxBuffer = char(val);
m_SerialPort.WriteToPort(TxBuffer,1);
对这句:TxBuffer = char(val);我比较疑惑,比如VAL=56,那么 char(56)就是一个字符吗?小弟基础不行,望大侠能指导我下,谢谢了 这个函数的作用是不是就是发送string中的前n个字符?
--是这样的。
char(val)
前面的char是类型强制转换,将32位的int型转成8位的char型。如何val大于255,将只保留低8位。char(56)还是等于56。
页:
[1]