CSerialPort类实现的串口通信关于LONG CMainFrame::OnComm(WPARAM ch,LPARAM port)处理问题

slj_win 2010-08-06 07:09:14
在LONG CMainFrame::OnComm(WPARAM ch,LPARAM port)中我想将单片机发送来的十六进制数据(单片机是按字节发送的),每一字放到一个unsigned char的一个数组中,有什么好的实现方式,不太了解 WPARAM ch,的类型是cstring还是十六进制数,还望高手指点啊!要是转换为str.Format("%02X ",ch);再去分离数据,转换十六进制数似乎有些麻烦,有没有好的方法啊!高手啊!大牛啊!给指点下啊!
...全文
383 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhstars 2010-08-10
  • 打赏
  • 举报
回复
mscomm控件是其实也是事件触发的,只不过是缓冲区有数据就触发,不管是一个字符还是一串字符,正如nEvent = m_Com.GetCommEvent();写到的一样,而CserialPort则是来一个字符就触发一次,所以会触发多次。
而mscomm则是你编程进行调用的。
slj_win 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhstars 的回复:]
不是系统调用OnComm,而是串口接收到一个字节就触发了这个函数(定义的消息函数),然后你要做的工作就是在OnComm函……
[/Quote]
也就是说串口受到多少字节,这个函数就调用多少次吧!
VARIANT vResponse;
int nEvent, k, i;
unsigned char *str;
unsigned char *str1;
nEvent = m_Com.GetCommEvent();
switch(nEvent)
{
case 2: //事件值为2表示接收缓冲区内有字符
k = m_Com.GetInBufferCount();
if(k > 0)
{
vResponse = m_Com.GetInput(); //read//读缓冲区
//对数据进行其他处理
str = (unsigned char *)(unsigned char*) vResponse.parray->pvData;
i=0;
str1 = str;
while (i < k)
{
pDoc->m_ByteRev[pDoc->m_nByteRev+i]=*str1;
i++;
str1++;
}
pDoc->m_nByteRev+=k;
}

break;
上边是用控件mscomm写的串口程序,这个好像是只调用了一次该函数,是吧!
zhstars 2010-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 slj_win 的回复:]

zhstars 单片机发送的是2048个字节,WPARAM是UINT,就是单片机发送的单字节,放到了ch中吧!OnComm每次取一个字节放到ch中,然后系统再调用OnComm再取下一个字节放到ch中直到取完为止,是这么理解吗?
[/Quote]
不是系统调用OnComm,而是串口接收到一个字节就触发了这个函数(定义的消息函数),然后你要做的工作就是在OnComm函数中处理接收的数据,给你我写过的一个参考。
m_RxData 和 m_iRxLen是CMainFrame的成员变量,m_iRxLen初始化要为0;
BYTE m_RxData[4096];
LONG CMainFrame::OnCommunication(UINT ch, LONG port)
{

if (port == 1) //COM1接收到的数据
{
m_RxData[m_iRxLen++]=ch;
if (m_iRxLen>=2048)
{
//写你自己的代码对数据处理
}

}
}
slj_win 2010-08-07
  • 打赏
  • 举报
回复
oyljerry 我刚接触vc不太理解!
slj_win 2010-08-07
  • 打赏
  • 举报
回复
zhstars 单片机发送的是2048个字节,WPARAM是UINT,就是单片机发送的单字节,放到了ch中吧!OnComm每次取一个字节放到ch中,然后系统再调用OnComm再取下一个字节放到ch中直到取完为止,是这么理解吗?
slj_win 2010-08-07
  • 打赏
  • 举报
回复
zhstars 单片机发送的是2048个字节,WPARAM是UINT,就是单片机发送的单字节,放到了ch中吧!OnComm每次取一个ch采一个字节放到ch中,然后系统再调用OnComm直到取完为止,是这么理解吗?
oyljerry 2010-08-07
  • 打赏
  • 举报
回复
WPARAM是指针,你可以发送的时候直接类型转换成这个指针,接受后,再对应类型转换回来
zhstars 2010-08-06
  • 打赏
  • 举报
回复
这个有什么麻烦的,WPARAM就是UINT,你直接转换就行了,代码如下:

unsigned char k = (unsigned char)ch

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧