VC++串口通讯程序如何修改接收框中显示的内容
相信做过串口通讯的朋友都知道串口调试助手这个软件,我也是用了基于MSComm控件用VC6.0写的程序。下面是一个很标准的接受函数:voidCSCommTestDlg::O...
相信做过串口通讯的朋友都知道串口调试助手这个软件,我也是用了基于MSComm控件用VC6.0写的程序。
下面是一个很标准的接受函数:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 每8个bit占一个内存
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
而我的程序也可以像串口调试助手那样,发送16进制得到16进制或者字符型数据。但是工作的需要,发送一个16进制读数指令,比如02 30 53 31 0D,仪表会返回我02 30 53 31 30 31 35 0D,字符型就是(02为起始符)0S1015(0D为结束符)。而我想在接收框中不显示02 30 53和结束符0D,请问做过的高手应该修改哪里呢?
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp; //加入接收编辑框对应字符串
}
}
理论上上面这一段就是接收的地方,可是我将strtemp转出来进行字符串的操作,再付入m_strEditRXData(接收区变量)的时候就会显示出乱码,或者中文,我已经试了20多种方法了,乱码就是去不掉,请问该怎么办,我该如何实现对这个接收框中内容的修改呢?
我最后想要的就是1015或者31 30 31 35这几个字符显示出来。
没错,是用了别人的代码,但是我说是什么?我说的是要修改接收框中的显示内容,我问题的中心内容是要屏蔽掉出现的东西,而不是别人的代码怎么样,别人的代码实现不了我想要的。所以我设置了char数组,指针还有处理函数来处理这个接收过来的strtemp临时变量,当然接受的m_strEditRXData也该放在循环体之外。
我也就经过了30多次调试,可是乱码的问题就是驱除不掉,我不知道你们是不是做过串口程序,经历没经历过初学,如果你们没有,只会说非学术性的东西来混分,就别在我这回答了谢谢。
我还知道好的程序时调试出来的呢,问题这不是调试了N回,想尽办法还是有乱码么? 展开
下面是一个很标准的接受函数:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 每8个bit占一个内存
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
而我的程序也可以像串口调试助手那样,发送16进制得到16进制或者字符型数据。但是工作的需要,发送一个16进制读数指令,比如02 30 53 31 0D,仪表会返回我02 30 53 31 30 31 35 0D,字符型就是(02为起始符)0S1015(0D为结束符)。而我想在接收框中不显示02 30 53和结束符0D,请问做过的高手应该修改哪里呢?
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp; //加入接收编辑框对应字符串
}
}
理论上上面这一段就是接收的地方,可是我将strtemp转出来进行字符串的操作,再付入m_strEditRXData(接收区变量)的时候就会显示出乱码,或者中文,我已经试了20多种方法了,乱码就是去不掉,请问该怎么办,我该如何实现对这个接收框中内容的修改呢?
我最后想要的就是1015或者31 30 31 35这几个字符显示出来。
没错,是用了别人的代码,但是我说是什么?我说的是要修改接收框中的显示内容,我问题的中心内容是要屏蔽掉出现的东西,而不是别人的代码怎么样,别人的代码实现不了我想要的。所以我设置了char数组,指针还有处理函数来处理这个接收过来的strtemp临时变量,当然接受的m_strEditRXData也该放在循环体之外。
我也就经过了30多次调试,可是乱码的问题就是驱除不掉,我不知道你们是不是做过串口程序,经历没经历过初学,如果你们没有,只会说非学术性的东西来混分,就别在我这回答了谢谢。
我还知道好的程序时调试出来的呢,问题这不是调试了N回,想尽办法还是有乱码么? 展开
展开全部
我想你可以这样:
1.由于串口方式下使用的是流式的协议,所以应该使用一个缓冲,假设为buf.
2.你收到数据后将收到的所有数据写入到缓冲中。
3.解析缓冲中的数据,这样解析,根据你的问题我大致可以知道你接收到的报文的头为02,尾为0D.
所以在解析的时候首先需要找到头的位置,然后在依次读取,直到遇到尾,然后将中间的数据显示出来即可.当然,根据你具体的协议可能还会有错误的处理.
具体是这样的:
struct packet
{
char head;//02
char data[20];
char tail;//0d
};
1.由于串口方式下使用的是流式的协议,所以应该使用一个缓冲,假设为buf.
2.你收到数据后将收到的所有数据写入到缓冲中。
3.解析缓冲中的数据,这样解析,根据你的问题我大致可以知道你接收到的报文的头为02,尾为0D.
所以在解析的时候首先需要找到头的位置,然后在依次读取,直到遇到尾,然后将中间的数据显示出来即可.当然,根据你具体的协议可能还会有错误的处理.
具体是这样的:
struct packet
{
char head;//02
char data[20];
char tail;//0d
};
展开全部
感觉你这 代码 类似 龚建伟 的 书上的代码!
再去 看看 他的 书吧
网络上有 电子文档 的
祝你顺利
再去 看看 他的 书吧
网络上有 电子文档 的
祝你顺利
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要老师抄袭代码,主要自己消化吸收呀,多去调试就好了。
好的程序是调试出来的。
好的程序是调试出来的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询