• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

MSComm控件数据处理!```

godzhwei 2008-04-23 10:25:41
void CPtx30Dlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,i,k=0;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp,m_RcvData,x;
if(m_CMScomm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
if (m_CMScomm.GetInBufferCount()==1)//缓冲区里有一个字节时进行判断
{
if (m_SendFlag==1)
{
m_SendFlag=0;
int len;
CString m_ascii;
CByteArray m_Array;
m_ascii="3c050301043f"; //判断返回“01”时才发这串啊
len=String2Hex(m_ascii,m_Array);
m_CMScomm.SetOutput(COleVariant(m_Array));
m_CMScomm.SetOutBufferCount(0);
}
if (m_SendFlag==3)
{
m_SendFlag=0;
int len;
CString m_ascii;
CByteArray m_Array;
m_ascii="3c0500030102af"; //判断返回“01”时才发这串啊
len=String2Hex(m_ascii,m_Array);
m_CMScomm.SetOutput(COleVariant(m_Array));
m_CMScomm.SetOutBufferCount(0);
}

}
if (m_CMScomm.GetInBufferCount()==87)
{
variant_inp=m_CMScomm.GetInput(); //读缓冲区
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for(i=0;i<len;i++)
safearray_inp.GetElement(&i,rxdata+i);
for(i=0;i<len;i++)
{
BYTE bt=*(char*)(rxdata+i);
strtemp.Format("%02X",bt);
m_RcvData+=strtemp;
}
MessageBox(m_RcvData);
}
}
}
我们协议发送数据时要先握手,即发送命令时要先发送“01”,等返回“01”时才能再发送命令。
发送的命令有两条:1,发3c050301043f 返回87个字节的数据。
2,发3c0500030102af 修改机器的值,返回“01”为修改成功,没有返回的话要重发。
我上面的代码应该怎么改呢?应该在上面代码中判断接收到的为“01”才能发送后面的3c050301043f啊,但是我不知道该怎么判断咯。。。请

帮帮忙了!~~ 还有请问是不是每次执行variant_inp=m_CMScomm.GetInput();这条语句后都清空缓冲区的??
...全文
68 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
meiZiNick 2008-05-01
等待牛人来答.
回复
UltraBejing 2008-05-01
有点难度哦
回复
NIKE霸天虎 2008-04-29
你回读分析方法和你在写出时的定义很相似,举例如下:
如果你向串口写一个命令:###START RUN$$$
###为起始头,$$$为结束标志
下位机返回命令如下:###OK$$$表示成功
###Error$$$表示成功出错
回复
godzhwei 2008-04-29
人.人.人.人呢????
回复
godzhwei 2008-04-29
好像还是没有合适的答案...
回复
hanjinchidm 2008-04-28
up
回复
godzhwei 2008-04-28
协议人家制定好了的咯...0xff作握手报文哪里特殊??
回复
CathySun118 2008-04-25
握手的报文不要和正式报文中的数据有冲突,你可以用比较特殊的内容,例如:0xFF
另外,报文最好有包头和包尾,以及校验,这么才容易确定接收的完整。
回复
godzhwei 2008-04-25
楼上说的我不太理解...什么是长帧头,状态机方式,FIFO???
回复
godzhwei 2008-04-25
楼上说的我不太理解...什么是长帧头,状态机方式,FIFO???
回复
zgl7903 2008-04-24
这种方式最好使用长帧头 因为数据帧中同样可能存在01这数据,无法区分是数据还是命令
使用状态机方式操作
接受使用循环FIFO方式处理
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-23 10:25
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……